将一个数组中的每个元素与其他数组中的元素进行匹配而无需循环

时间:2019-05-22 09:17:25

标签: arrays matlab loops

我想将一个数组(lessnum)的每个元素与另一个数组(cc)的元素匹配。然后与第三个数组(gl)中的数字相乘。我正在使用循环。数组的长度非常大,因此需要几个小时。是否有可能没有循环或使其更快。这是我正在执行的代码,

uniquec=sort(unique(cc));
maxc=max(uniquec);
c35p=0.35*maxc;
lessnum=uniquec(uniquec<=c35p);
greaternum=uniquec(uniquec>c35p);
gl=linspace(1,2,length(lessnum));
gr=linspace(2,1,length(greaternum));
 newC=zeros(size(cc));
for i=1:length(gl)
    newC(cc==lessnum(i))= cc(cc==lessnum(i)).*gl(i);
end
for i=1:length(gr)
    newC(cc==greaternum(i))= cc(cc==greaternum(i)).*gr(i);
end

1 个答案:

答案 0 :(得分:2)

您需要做的是分别存储这些数字的索引,而不是分别在c35plessnum中存储小于或大于greaternum的值。这样,您可以使用这些索引直接访问newC变量,然后将您线性生成的值相乘。

进一步的修改在代码本身中进行了说明。如果您有任何疑问,可以阅读unique

的帮助

这是修改后的代码(我假设cc是一维数组)

%randomly generate a cc vector
cc = randi(100, 1, 10);
% modified code below
[uniquec, ~, induniquec]=unique(cc, 'sorted'); % modified to explicitly specify the inbuilt sorting capability of unique and generate the indicies of unique values in the array
maxc=max(uniquec);
c35p=0.35*maxc;
lessnum=uniquec<=c35p; % instead of lessnum=uniquec(uniquec<=c35p);
greaternum=uniquec>c35p; % instead of greaternum=uniquec(uniquec>c35p);
gl=linspace(1,2,sum(lessnum));
gr=linspace(2,1,sum(greaternum));
% now there is no need for 'for' loops. We first modify the unique values as specified and then regenerate the required matrix using the indices obtained previously
newC=uniquec;
newC(lessnum) = newC(lessnum) .* gl;
newC(greaternum) = newC(greaternum) .* gr;
newC = newC(induniquec);

此新代码的运行速度将比原始代码快得多,但会占用更多的内存,具体取决于原始数组中唯一值的数量。