2

如何在不使用 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
4

2 回答 2

3

看起来你正在做一个直方图并跟踪哪个元素最终在哪个 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}。如果这是一个问题,我相信你可以解决它......

另请注意,您的代码在0and之间生成随机数50,但您的“有效箱”仅在10and之间50(因为您编写算法的方式)。因此,收集的索引总和将略小于 50(平均为 40)。

于 2013-03-08T22:37:11.593 回答
2

下面的脚本将做同样的事情。该矩阵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
于 2013-03-08T21:41:45.940 回答