【发布时间】:2020-10-08 20:56:56
【问题描述】:
假设我有四个 Matlab 数组 A_1、A_2、A_3、A_4 每个维度 mxn,其中 m 可能很大。这些矩阵包含严格的正数。
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);
A_4=betarnd(1,2,m,n);
我想用文字做什么:
我想构造一个维度为bx4 的矩阵B,以便B 的每一行报告
索引[i,j,k,h] 如果
A_1(i,1)+A_2(j,1)+A_3(k,1)+A_4(h,1)<=quantile(A_1(i,2:end)+A_2(j,2:end)+A_3(k,2:end),A_4(h,2:end) 0.95)
对于从1 到m 的每个i,j,k,h。
注意b 最多可以是m^4。
我想做的可以通过循环i,j,k,h来实现。但是,我需要处理一个大的m。因此,我希望您能帮助我构建一个非常高效的代码,这反过来又可以帮助我了解我可以将m 推到多远。
这个答案here 非常有帮助,尽管它解决了一个稍微不同的问题。下面,我正在尝试针对我的具体情况重新调整它。可以改进吗?另外,我不知道如何在B 中正确存储索引。
lhs4=A_4(:,1)-A_4(:,2:end); %mx(n-1)
lhs1=A_1(:,1)-A_1(:,2:end);
lhs2=A_2(:,1)-A_2(:,2:end);
rhs3=A_3(:,2:end)-A_3(:,1);
Q = .95 * (n - 1);
h_all=(1:1:m).';
for i=1:m
for j=1:m
LHS=lhs4+lhs1(i,:)+lhs2(j,:); %mx(n-1)
for k=1:m
h=h_all.*(sum(LHS>rhs3(k,:),2)<Q); %mx1
h(h==0)=[]; %delete the zeros
%HOW DO I STORE {i,j,k,h}?
end
end
end
【问题讨论】:
-
你的意思是
quantile(A_1(i,2:end)+A_2(j,2:end)+A_3(k,2:end)+A_4(h,2:end), 0.95)吗? -
好的,谢谢。
-
请注意,如果像链接的问题一样,
m的值是10^5,并且数据的 %95 与条件匹配,并且您希望存储不匹配的案例的索引(即剩下的 %5) 作为 int32 你需要接近 17.3 exabytes 的内存。并且 10^20 超出了 uint64 索引范围。 -
我知道,m 太大了。我确实需要使用更小的数组,但我仍然需要高效的代码。
标签: matlab