我有一个函数,最多需要七个参数并返回一个行向量。前三个参数是向量(列,列,行),其余四个是可选标量。
我想使用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
答案 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)