我确信以前已经回答了类似的问题,但我是MATLAB的新手并且目前遇到了一个非常简单的问题。我有一个矩阵M
,我想执行以下操作:遍历列C
的所有值,如果这些值中的任何值不等于某个值,x
副本将相应的值转换为矩阵中的另一列(称为Z
),同时保留那些不满足条件的值。
我尝试了以下内容,但它没有做任何事情:
rows = size(M,1);
for i = 1:rows
if M(:,x) ~= 0
then M(:,Z) = M(:,x)
end
end
答案 0 :(得分:0)
看看你的评论,这是你想要完成的要点:
A
,在此矩阵中选择两列:x
和Z
。 d
,我们希望找到x
中不同的所有值<{1}}。d
中获取这些位置,然后将其复制到x
中的相应位置。让我们一步一步来做。在你的评论中给出你的例子:
Z
由于您是MATLAB的新手,让我们慢慢来看看。第一步是非常基本的MATLAB语法。它选择你的参数以及一些基本的设置。第二步将为我们提供一个逻辑数组,告诉我们% // Step #1
A = [1 2 3; 4 5 6; 7 8 10];
x = 1; % //Column x
Z = 3; % //Column Z
d = 1; % //Value to compare to
% //Step #2
loc = A(:,x) ~= d;
%//Step #3
A(loc, Z) = A(loc, x);
列中的哪些行不等于x
。最后一步将在列d
中找到这些相应的行,并将这些值从列Z
复制到x
。
MATLAB的优点在于它本身可以进行这些矢量化操作。优化的最佳方法是尽可能多地尝试避免循环。如果您必须重复繁重的计算,或者您绝对无法避免Z
循环的情况,请仅使用for
循环。
作为奖励,让我们看看MATLAB如何显示我们上面谈过的每一步(除了第一步,因为它是多余的)。
for
请注意,% //Step #2
loc = A(:,x) ~= d
>> loc
loc =
0
1
1
%// Step #3
A(loc, Z) = A(loc, x)
>> A =
1 2 3
4 5 4
7 8 7
是一个逻辑数组,loc
为false,0
为真。因此,第2行和第3行满足这些值不等于1
的条件。
另外,FWIW,欢迎来到StackOverflow!