gpt4 book ai didi

matlab - 通过嵌套循环构建Matlab数组

转载 作者:行者123 更新时间:2023-12-03 23:04:04 29 4
gpt4 key购买 nike

假设我有三个矩阵 A_1 , A_2 , A_3每个维度mxn ,其中 mn很大。这些矩阵包含严格的正数。
我想构造一个矩阵 check维度 mx1这样,对于每个 i=1,...,m :check(i)=1如果 存在 j,k以至于A_1(i,1)+A_2(j,1)+A_3(k,1)<=quantile(A_1(i,2:end)+A_2(j,2:end)+A_3(k,3:end), 0.95)就我而言 m大 ( m=10^5 ) 和 n=500 .因此,我希望您能帮助找到一种有效的方法来做到这一点。

下面我重现一个例子。我强加 m比实际小,并报告我不完整且可能低效的构建 check 的尝试.

clear
rng default
m=4;
n=500;
A_1=betarnd(1,2,m,n);
A_2=betarnd(1,2,m,n);
A_3=betarnd(1,2,m,n);
check=zeros(m,1);
for i=1:m
for j=1:m
for k=1:m
if A_1(i,1)+A_2(j,1)+A_3(k,1)<=quantile(A_1(i,2:end)+A_2(j,2:end)+A_3(k,2:end), 0.95)
check(i)=1;
STOP TO LOOP OVER j AND k, MOVE TO THE NEXT i (INCOMPLETE!)
else
KEEP SEARCHING FOR j,k SUCH THAT THE CONDITION IS SATISFIED (INCOMPLETE!)
end
end
end
end

最佳答案

给定一个标量 x和一个向量 v表达式 x <=quantile (v, .95)可以写成 sum( x > v) < Q哪里Q = .95 * numel(v) *.
还有 A_1可以在循环之前拆分以避免额外的索引。
此外,可以删除最内部的循环以支持矢量化。

Af_1 = A_1(:,1);
Af_2 = A_2(:,1);
Af_3 = A_3(:,1);
As_1 = A_1(:,2:end);
As_2 = A_2(:,2:end);
As_3 = A_3(:,2:end);
Q = .95 * (n -1);
for i=1:m
for j=1:m
if any (sum (Af_1(i) + Af_2(j) + Af_3 > As_1(i,:) + As_2(j,:) + As_3, 2) < Q)
check(i) = 1;
break;
end
end
end
通过重新排列不等式和预计算中涉及的表达式,可以实现更多优化:
lhs = A_3(:,1) - A_3(:,2:end);
lhsi = A_1(:,1) - A_1(:,2:end);
rhsj = A_2(:,2:end) - A_2(:,1);
Q = .95 * (n - 1);
for i=1:m
LHS = lhs + lhsi(i,:);
for j=1:m
if any (sum (LHS > rhsj(j,:), 2) < Q)
check(i) = 1;
break;
end
end
end
  • 请注意,由于 quantile 的计算中使用的方法您可能会得到略有不同的结果。
  • 关于matlab - 通过嵌套循环构建Matlab数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63851294/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com