为Matlab Coder定义可变大小的输入数据

时间:2013-08-14 22:08:19

标签: matlab mex matlab-coder

我正在尝试使用Matlab编码器从.m文件生成一个mex代码文件。代码是

function [result,x]=tesrank(A,x)

result = [];
n = x;
for col= 1:n
   result = [result, sum(A==col, 2)];
end

对于固定大小,我可以使用

获取它
codegen tesrank -args {zeros(2,3), zeros(1)}
% Here size(A)=2x3 and size(x)=1x1

如何在不限制A和x的大小的情况下进行此操作?

3 个答案:

答案 0 :(得分:1)

您不必限制数组A的大小。

检查此示例(使用Matlab 2014a):

codegen('funcAccumarray1D_max.m', ...
    '-report', ...
    '-args', {coder.typeof(double(0), [Inf 1]), ...
              coder.typeof(double(0), [Inf 1])}, ...
    '-o', 'funcAccumarray1D_max')

这个功能:

function [ outs ] = funcAccumarray1D_max(subs, vals, sz) 
%FUNCACCUMARRAY1D_MAX Construct an array by accumulation using 'max'
%#codegen
outs = NaN(sz, 1, 'like', vals);
for ix=1:size(subs,1)
  sub = subs(ix);
  outs(sub,1) = max(outs(sub,1), vals(ix,1));
end
end

答案 1 :(得分:0)

对于构建,函数coder.typeof是您的朋友。要做你想要的,即拥有允许无界尺寸的变量,你可以用这种方式声明你的输入参数:

codegen tesrank -args {coder.typeof(0, [Inf, Inf]), coder.typeof(0, [1, Inf])}

在我的例子中,A在两个维度上是完全无界的(你可以有两个以上,只是将size数组的长度增加到typeof)并且x在第一维中被限制为大小为1,但是无界限在第二个维度。看看你的代码,你可能不希望x无界限,但如果你这样做,那就是你如何做到的。

你可以探索更多coder.typeof的功能。

答案 2 :(得分:-1)

根据Mathworks'documentation的第7-15页和第25-24页,您不能这样做。