如何找到数组中元素快/不使用for循环吗?

47个视图(30天)
你好,
我有以下工作代码 for循环 但我想让这一过程更快。数组的大小,我现在用这个过程需要30秒。
代码:
邻居 与整数数组X 2只(例如65000 X 2)
广场 是由4只与整数数组Y(例如35000 x 4)
B = 0(广场、1);%的预先配置我试着——没有多少帮助,最小的节约时间
i = 1:长度(邻居)% for循环虽然值从1到长度的数组~例如1:65000“邻居”
B =任何(广场= =(邻居(我,1)),2)&任何(广场= =(邻居(我,2)),2);
%的发现indicies线在“广场”,有两个值”i排“邻居”数组
结束
如果不清楚的代码我想做的是:
我想去的 邻居的 逐行数组并获得indicies行 “广场” 数组包含这一行的值作为邻居数组。
例子:
如果 邻居 数组只有1行
(1 2)
,, 广场 数组看起来像这样:
[4 58 6 7;
1 2 47 48;
84年12 8 9],
然后输出应该索引的线 广场 数组,即同时包含数字。
2
我曾经尝试过预先配置,但保存的时间是边际。你有任何想法如何使这个更快,理想情况下没有一个for循环吗?
非常感谢,
1月

接受的答案

Turlough休斯
Turlough休斯 2022年2月5日
编辑:Turlough休斯 2022年2月5日
在示例中提供你实际上不存储任何指标。同样重要的是要考虑,你会得到结果,不止一个邻居匹配一个正方形,或没有匹配一个广场——你需要存储单元阵列中的指标。通过一些不同的方法,让第一个生成一些类似的数据:
邻居=兰迪(1000、65000、2);
广场=兰迪(1000、35000、4);
B =细胞(高度(广场),1);
我做了三种方法的问题首先是基于你提供的例子。
方法1 根据你提供的例子:
抽搐
i = 1:长度(邻居)
我{}=找到(
任何(广场= =(邻居(我,1)),2)&
任何(广场= =(邻居(我,2)),2)
);
结束
toc
%运行时间是33.780513秒。(Mathworks服务器)
%运行时间是21.165682秒。(我的电脑)
21秒在我的电脑,我们可以获得一些improvent方法2。
方法2 而不是使用&,更快的索引为广场第一逻辑表达式。通过这种方式,你只扫描方块的一部分的邻居(我,2),而不是整个数组,这是一个显著的改善。在某种意义上,这是向量相当于逻辑短路。
B =细胞(高度(广场),1);
抽搐
i = 1:长度(邻居)
idx =找到(任何(广场= =(邻居(我,1)),2));
我{}= idx(任何(广场(idx:) = =(邻居(我,2)),2));
结束
toc
%运行时间是21.825993秒。(Mathworks服务器)
%运行时间是12.312727秒。(我的电脑)
方法3 事实证明,任何(someArray, 1),速度比任何(someArray, 2),这并不是我在MATLAB列顺序。通过一些修改我们可以得到另一个改进。
B =细胞(高度(广场),1);
抽搐
广场=广场。”;
i = 1:长度(邻居)
idx =找到(任何(广场= =邻居(我,1),1));
我{}= idx(任何(广场(:,idx) = =(邻居(我,2)),1))。”;
结束
toc
%运行时间是11.630071秒。(Mathworks服务器)
%运行时间是6.896441秒。(我的电脑)
所以对我来说,是一个3 x改进,和它3 x MathWorks服务器上的改进。
编辑: 找到 需要在第一个逻辑表达式用于方法2和3。
4评论

登录置评。

答案(1)

克里斯托弗McCausland
克里斯托弗McCausland 2022年2月3日
嗨,简,
ismember 的函数应该能够这样做!
克里斯多夫
5个评论
Jan Brychta
Jan Brychta 2022年2月5日
编辑:Jan Brychta 2022年2月5日
嗨,克里斯多夫,
我知道,大小差异不是使这更容易。问题是,“广场”数组的每一行表示4 verticies广场。这就是为什么我需要保持这种格式没有重新排列。
基本上这些线的代码的目的是找到的“墙”(邻居数组的行)对应于“腔调”方阵(行)通过匹配值。
谢谢,
1月

登录置评。

类别

找到更多的在循环和条件语句帮助中心文件交换

标签

下载188bet金宝搏


释放

R2021b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的