bsxfun()无效的输出尺寸

时间:2014-12-21 12:22:47

标签: matlab vectorization

我有一个函数,最多需要七个参数并返回一个行向量。前三个参数是向量(列,列,行),其余四个是可选标量。

我想使用bsxfun()将函数应用于其最后一个参数的向量。以下是我尝试这样做的。

o = @(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff) ELE452Functions.EvaluateBER(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff);
oo = @(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff) bsxfun(@(N0,channel_cutoff) o(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff), N0' , channel_cutoff);

当我尝试使用向量oo(m,pulse,N0,1,1,1,[0.5 0.2]);调用该函数时,我收到此错误:

Error using bsxfun
Invalid output dimensions.

我没有使用bsxfun的经验,我试图按照文档。

更新

可能这是一个更清楚的方式来问我的问题: 我想用bsxfun来重写(改进)下面的代码而没有循环。

for i=1:length(channel_normalized_cuttoffs)
    BER_LPchannel(i,:) = ELE452Functions.EvaluateBER(m,pulse,N0,1,1,1,channel_normalized_cuttoffs(i));
end

1 个答案:

答案 0 :(得分:1)

bsxfun背后的想法是为两个元素的所有可能组合评估某个函数(b中的bsxfun代表二进制),每个元素都来了来自其中一个阵列。 (注意:如果您将其与行和列向量一起使用,则此选项有效。但bsxfun也可以执行更多操作。)

您想要实现的目标很简单:对于单个阵列的所有条目,请评估函数。 所以bsxfun在这里不是正确的选择。

您可以使用arrayfun代替,但这仍然可能不会比原来的for循环好很多,因为看起来Matlab JIT编译器能够优化其中的大部分,考虑到它'简单。

由于我没有您的功能代码,我无法对其进行测试,但您的解决方案可能看起来很像:

evalBER = @(CNcutoffi) ELE452Functions.EvaluateBER(m,pulse,N0,1,1,1,CNcutoffi);
BER_LPchannel = arrayfun(evalBER, channel_normalized_cuttoffs, 'UniformOutput', false)