我使用了codegen工具从MATLAB生成C代码。这个函数可以描述为:
function [result] = calculate_data(my_matrix)
for idx = 1:length(my_matrix)
result = result + sum(my_matrix(idx,1:3));
end
end
使用代码生成工具时,我明确声明my_matrix是double(:inf, 3)类型。换句话说,行数是无限的,但它将有3列。当代码生成时,这是我要执行的函数:
calculate_data(my_matrix : UnsafePointer<emxArray_real_T>!, result : UnsafeMutablePointer<emxArray_real_T>!)
在另一个c文件中,emxArray_real_T的定义如下:
struct emxArray_real_T
{
double *data;
int *size;
int allocatedSize;
int numDimensions;
boolean_T canFreeData;
};
当我看到上述类的初始化选项时,其中一个选项特别合理:
emxArray_real_T.init(data: UnsafeMutablePointer<Double>!, size: UnsafeMutablePointer<Int32>!, allocatedSize: Int32, numDimensions: Int32, canFreeData: boolean_T)
我试图按照这篇文档的指导来理解如何调用生成的C代码,但我认为我可能错过了一些基本步骤。以下是我的操作:
// create an 2d array with some fake data
var mySampleData = [[Double]]();
for i in 0 ..< 3 {
mySampleData.append([1.1, 2.2, 3.3]);
}
// begin fulfilling requirements for emxArray_real_T
var data_pointer = UnsafeMutablePointer<Double>.allocate(capacity: 3);
data_pointer.initialize(from: mySampleData)
然而,上述代码会抛出一个错误,指出:
Generic parameter 'C' could not be inferred
我认为我做错了一些事情,可能走错了方向。有一个类似的帖子与我的问题相关: 如何将float[][]类型的数组转换为"emxArray_real_T *x",但是提供的解决方法似乎是针对C而不是Swift 4的。如何使用Swift 4有效地调用C函数,并满足emxArray_real_T.init方法的要求?使用虚假数据来演示基本原理是可以的。
my_matrix
缩减为类型为double
的1x1矩阵(result
)。然而,生成的代码更通用,允许从MxN到KxL矩阵的转换。这些假设正确吗?此外,生成的calculate_data
函数必须是C函数,但它没有显示;相反,只给出了它的Swift表示形式。C函数是什么样子的? - Anatoli P