将 for 循环转换为向量表达式
Convert for loop into vector expression
我是 MATLAB 的新手,正在学习使用向量表达式而不是冗长的 for 循环。我有一个片段,我想知道它是否可以用简洁的向量编写,如果可以,我将如何修改它。
for v = I
X(i, v) = X(i, v) + length(I(I == v));
end
X
是 1500x200
I
是 3763x1
i
可以认为是常数
我在这里做的是这个。 I
包含 X
的列索引,我想按特定索引在 I
中出现的次数递增这些位置。因此,在这个 for 循环完成后,X
的第 i
行将包含一个直方图。
任何其他改进我的 MATLAB 编码的想法或建议也将不胜感激。
这里有几种方法:
I = randi(10, [50,1]);
X = zeros (1, 10);
for Col = 1 : size (X, 2)
X(1, Col) = sum (I == Col);
end
% X = 7 7 3 3 7 4 5 8 1 5
X = zeros (1, 10);
for Col = I.' % the transpose operation is needed to convert to horizontal!
X(1, Col) += 1;
end
% X = 7 7 3 3 7 4 5 8 1 5
X = zeros (1, 10);
X = accumarray (I, ones (size (I)), size (X))
% X = 7 7 3 3 7 4 5 8 1 5
我是 MATLAB 的新手,正在学习使用向量表达式而不是冗长的 for 循环。我有一个片段,我想知道它是否可以用简洁的向量编写,如果可以,我将如何修改它。
for v = I
X(i, v) = X(i, v) + length(I(I == v));
end
X
是 1500x200
I
是 3763x1
i
可以认为是常数
我在这里做的是这个。 I
包含 X
的列索引,我想按特定索引在 I
中出现的次数递增这些位置。因此,在这个 for 循环完成后,X
的第 i
行将包含一个直方图。
任何其他改进我的 MATLAB 编码的想法或建议也将不胜感激。
这里有几种方法:
I = randi(10, [50,1]);
X = zeros (1, 10);
for Col = 1 : size (X, 2)
X(1, Col) = sum (I == Col);
end
% X = 7 7 3 3 7 4 5 8 1 5
X = zeros (1, 10);
for Col = I.' % the transpose operation is needed to convert to horizontal!
X(1, Col) += 1;
end
% X = 7 7 3 3 7 4 5 8 1 5
X = zeros (1, 10);
X = accumarray (I, ones (size (I)), size (X))
% X = 7 7 3 3 7 4 5 8 1 5