arrays - 将一个数组的每个元素与另一个数组的元素匹配,无需循环
问题描述
我想将一个数组(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
解决方案
您需要做的不是分别存储小于或大于和c35p
的值,而是存储这些数字的索引。这样,您可以使用这些索引直接访问变量,然后将线性生成的值相乘。lessnum
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);
这个新代码将比原来的代码运行得快得多,但是会占用更多的内存,具体取决于原始数组中唯一值的数量。
推荐阅读
- mysql - MySql:以有效的方式求和订单(或太慢)
- windows - 使用 WinSCP get 命令下载两种类型的文件(*.bat 和 *.txt)
- php - php从多维数组购物车中删除特定项目
- php - 将数据导出到 Excel PHP 和 MySQL
- java - 如何在 JSystem 中获取场景开始的时间?
- java - 使用 ArrayList 进行堆放
- html - 如何在 HTML5 中制作特定单选按钮并在手动添加数据时自动选择指定
- sql - 添加excel目标时出现SSIS错误
- javascript - 从选定文件中删除一个文件并更新输入文件的表单数据
- jquery - 清除后如何设置间隔