Matlab中矩阵元素根据索引变化
Matrix element changes according to index in Matlab
我有两个函数 f(x,y) 和 g(x,y),其中 x 和 y 从 x=x0:xt:xN 和 y=y0:yt:yM 变化(在我的真正的问题是这些是长向量)。首先,我想找到每组的最小值,例如说 Min(i,j)= min(f(x(i),y(j)),g(x(i),y(j))),然后我想找到所有 Min(i, j), 以及相应的 x(i) 和 y(j).
这是我所做的。但我知道这需要很长时间,而且 PC 对于长数组会变慢:
x=[2:1:5];
y=[4:2:10];
xl=length(x);
yl=length(y);
a=zeros(xl,yl);
for j=1:yl
for i=1:xl
f=x(i)+y(j);
g=x(i)*y(j);
a(i,j)=min(f,g);
end
end
max(a(:))
这里我用了f和g两个简单的函数,但实际的函数是更复杂的形式,包括log函数等。
更重要的是,我还想得到对应的x(i)和y(j)
有人可以帮我 simpler/faster 代码吗?
hvar=0.02:0.02:2.5;
hl=length(hvar);
hfix=1.0*ones(1,hl);
a=hvar;
b=hvar;
output = zeros(hl,3);
step=0.0001;
x=1.001:step:1.999;
y=0.001:step:0.999;
xl=length(x);
yl=length(y);
for k=1:hl
r=zeros(xl,yl);
for j=1:yl
for i=1:xl
L=y(j)*log(1+2*a(k)-(2*a(k)/x(i)));
R=y(j)*log(1-a(k)*b(k)*x(i)+(2*a(k)*b(k)/y(j)));
r(i,j)=min(L,R);
end
end
[output(k,1) ind]=max(r(:)); %val in 1st column
[p q] = ind2sub(size(r),ind);
output(k,2)=1.001+(p-1)*step; %opt x in 2nd column
output(k,3)=0.001+(q-1)*step; %opt y on 3rd column
end
save('output');
简要讨论和解决方案代码
你有三个巨大的嵌套循环,巨大的循环迭代很多。我在 vectorization
上 全力以赴 并且我 运行 内存不足给定的大数据量。所以,你能做的最好的事情就是摆脱两个最内层的循环并保留最外层的迭代器循环,k
.
因此,设置参数和输入后的建议方法如下所示 -
for k=1:hl
L1 = bsxfun(@times,log(1+2*a(k)-(2*a(k)./x)).',y); %//'
R1 = bsxfun(@times,log(bsxfun(@plus,1-ab(k)*x(:),2*ab(k)./y)),y);
r1 = min([L1(:) R1(:)],[],2);
[output(k,1), ind] = max(r1);
[p, q] = ind2sub(size(L1),ind);
output(k,2)=1.001+(p-1)*step;
output(k,3)=0.001+(q-1)*step;
end
基准测试
无法对完整数据集进行基准测试,因为即使 k
的单次迭代,典型的运行时间也很多。因此,为了比较提议方法和原始方法之间的运行时间的基准测试,我 运行 一次迭代的代码:k = 1
然后五次迭代的代码:k = 1:5
。
使用这两种情况背后的想法是,当我们增加迭代器 k
的迭代次数时,看看所提出方法的加速可能如何扩大。
得到的运行时间如下。
情况一:k = 1
--------------------------------- With Proposed Approach
Elapsed time is 1.934156 seconds.
--------------------------------- With Original Approach
Elapsed time is 9.659695 seconds.
案例二:k = 1:5
--------------------------------- With Proposed Approach
Elapsed time is 10.387461 seconds.
--------------------------------- With Original Approach
Elapsed time is 49.094747 seconds.
结论: 正如人们可以很容易地注意到,使用建议的矢量化方法比原始方法,随着我们增加 k
.
的循环迭代, 线性 扩大
我有两个函数 f(x,y) 和 g(x,y),其中 x 和 y 从 x=x0:xt:xN 和 y=y0:yt:yM 变化(在我的真正的问题是这些是长向量)。首先,我想找到每组的最小值,例如说 Min(i,j)= min(f(x(i),y(j)),g(x(i),y(j))),然后我想找到所有 Min(i, j), 以及相应的 x(i) 和 y(j).
这是我所做的。但我知道这需要很长时间,而且 PC 对于长数组会变慢:
x=[2:1:5];
y=[4:2:10];
xl=length(x);
yl=length(y);
a=zeros(xl,yl);
for j=1:yl
for i=1:xl
f=x(i)+y(j);
g=x(i)*y(j);
a(i,j)=min(f,g);
end
end
max(a(:))
这里我用了f和g两个简单的函数,但实际的函数是更复杂的形式,包括log函数等。
更重要的是,我还想得到对应的x(i)和y(j)
有人可以帮我 simpler/faster 代码吗?
hvar=0.02:0.02:2.5;
hl=length(hvar);
hfix=1.0*ones(1,hl);
a=hvar;
b=hvar;
output = zeros(hl,3);
step=0.0001;
x=1.001:step:1.999;
y=0.001:step:0.999;
xl=length(x);
yl=length(y);
for k=1:hl
r=zeros(xl,yl);
for j=1:yl
for i=1:xl
L=y(j)*log(1+2*a(k)-(2*a(k)/x(i)));
R=y(j)*log(1-a(k)*b(k)*x(i)+(2*a(k)*b(k)/y(j)));
r(i,j)=min(L,R);
end
end
[output(k,1) ind]=max(r(:)); %val in 1st column
[p q] = ind2sub(size(r),ind);
output(k,2)=1.001+(p-1)*step; %opt x in 2nd column
output(k,3)=0.001+(q-1)*step; %opt y on 3rd column
end
save('output');
简要讨论和解决方案代码
你有三个巨大的嵌套循环,巨大的循环迭代很多。我在 vectorization
上 全力以赴 并且我 运行 内存不足给定的大数据量。所以,你能做的最好的事情就是摆脱两个最内层的循环并保留最外层的迭代器循环,k
.
因此,设置参数和输入后的建议方法如下所示 -
for k=1:hl
L1 = bsxfun(@times,log(1+2*a(k)-(2*a(k)./x)).',y); %//'
R1 = bsxfun(@times,log(bsxfun(@plus,1-ab(k)*x(:),2*ab(k)./y)),y);
r1 = min([L1(:) R1(:)],[],2);
[output(k,1), ind] = max(r1);
[p, q] = ind2sub(size(L1),ind);
output(k,2)=1.001+(p-1)*step;
output(k,3)=0.001+(q-1)*step;
end
基准测试
无法对完整数据集进行基准测试,因为即使 k
的单次迭代,典型的运行时间也很多。因此,为了比较提议方法和原始方法之间的运行时间的基准测试,我 运行 一次迭代的代码:k = 1
然后五次迭代的代码:k = 1:5
。
使用这两种情况背后的想法是,当我们增加迭代器 k
的迭代次数时,看看所提出方法的加速可能如何扩大。
得到的运行时间如下。
情况一:k = 1
--------------------------------- With Proposed Approach
Elapsed time is 1.934156 seconds.
--------------------------------- With Original Approach
Elapsed time is 9.659695 seconds.
案例二:k = 1:5
--------------------------------- With Proposed Approach
Elapsed time is 10.387461 seconds.
--------------------------------- With Original Approach
Elapsed time is 49.094747 seconds.
结论: 正如人们可以很容易地注意到,使用建议的矢量化方法比原始方法,随着我们增加 k
.