3

我正在尝试使用 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 大小的情况下做到这一点?

4

3 回答 3

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
于 2014-09-28T17:21:48.547 回答
0

对于构建,函数coder.typeof是你的朋友。要执行您想要的操作,即拥有允许无界维度的变量,您可以这样声明输入参数:

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

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

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

于 2015-04-14T03:21:49.260 回答
-1

根据 Mathworks文档的 p7-15 和 p25-24 页,您不能。

于 2013-12-02T14:34:13.607 回答