如何在不使用 for 循环的情况下实现这个 Matlab 代码?
b=10:10:50
a=50*rand(1,50);
for ii=2:numel(b)
ind{ii}=find(a<b(ii) & a>b(ii-1));
end
如何在不使用 for 循环的情况下实现这个 Matlab 代码?
b=10:10:50
a=50*rand(1,50);
for ii=2:numel(b)
ind{ii}=find(a<b(ii) & a>b(ii-1));
end
看起来你正在做一个直方图并跟踪哪个元素最终在哪个 bin 中。这意味着您可以通过以下几行“几乎”获得您想要的东西:
a = 50 * rand(1, 50);
b = 10:10:50;
[h c] = histc(a, b);
现在 c 包含 a 中每个元素的“bin”的索引。例如,如果
a = [15 22 9 7 25];
然后
c = [1 2 0 0 2];
不确定将这些收集到一个单元格数组中的价值 - 在我看来,无论您想对 in 中的值做什么,ind
都可以使用c
.
我怀疑使用“向量”操作(这意味着具有相同长度的事物)创建一个单元数组(可能具有不同的长度)可能很困难......有兴趣看到有人提出一个反例!
编辑:我发现了我自己的反例......下面的行ind
就像你的代码一样产生一个单元格数组(arrayfun
命令确实有一个隐含的for
循环,但被认为是“矢量化的”)。
ind = arrayfun(@(x)find(x==c),1:numel(b)-1, 'uniformoutput', false);
请注意,完成此操作后,单元格数组ind
的值从单元格ind{1}
开始,而您的原始代码从单元格索引ind{2}
。如果这是一个问题,我相信你可以解决它......
另请注意,您的代码在0
and之间生成随机数50
,但您的“有效箱”仅在10
and之间50
(因为您编写算法的方式)。因此,收集的索引总和将略小于 50(平均为 40)。
下面的脚本将做同样的事情。该矩阵newInd
将包含分配给ind
循环并由循环打印出的相同值。
b=10:10:50;
a=sort(randi(50,1,10));
% create shifted version of vector b to account
% for comparison between i and i-1
newB1 = b(1:end-1);
newB2 = b(2:end);
% create tiled version of a and b
newB1 = repmat(newB1',1,numel(a));
newB2 = repmat(newB2',1,numel(a));
newA = repmat(a,numel(b)-1,1);
%find linear indices that meet required conditions
LinearInd = find(newA<newB2 & newA>newB1);
%convert linear indices to subscripts
[i,newInd] = ind2sub(size(newA),LinearInd);
% display indices that correspond to ind
newInd