在MATLAB中,如果我有一个计算的东西率在for循环中这样在matlab中,如何连接for循环中计算的值?
for t=1:10
Ratek=(1/2)*(log2(1+SINR1k)+log2(1+SINR2k));
end
每一次的速度不同的价值,我想在来连接这个速度的所有值码在每个循环中,以便在第10个循环之后,我计算出10个速率来使用它们。我怎样才能做到这一点 ?
在MATLAB中,如果我有一个计算的东西率在for循环中这样在matlab中,如何连接for循环中计算的值?
for t=1:10
Ratek=(1/2)*(log2(1+SINR1k)+log2(1+SINR2k));
end
每一次的速度不同的价值,我想在来连接这个速度的所有值码在每个循环中,以便在第10个循环之后,我计算出10个速率来使用它们。我怎样才能做到这一点 ?
这个怎么样,建立在@勒夫的回答是:
Ratek = []
for t=1:10
val = (1/2)*(log2(1+SINR1k)+log2(1+SINR2k));
if ~Any(Ratek == val)
Ratek(end+1) = val;
end
如果你想contenate为字符串:
num2str(Ratek)
我不是真的到MATLAB,但是这是我的起飞。
我假设你想连接计算结果到一个向量;然后您可以分配给Ratek(end+1)
来追加该值;
Ratek = []
for t=1:10
Ratek(end+1) = (1/2)*(log2(1+SINR1k)+log2(1+SINR2k));
end
(假设实际计算每次静态实例,而不是给出一个单独的值)作为一个侧面说明,越来越多的载体和循环可能真的伤害了性能,如果你这样做频繁,所以要注意的性能影响。
如果你的数据是静态的,你只希望不要重复相同的结果10次,然后
Ratek(1:10) = (1/2)*(log2(1 + SINR1k)+log2(1 + SINR2k));
但是,这不会是多大用处的,所以我会认为SINR1k
和SINR2k
是10x1向量。现在
SINR1k = randi(10,10,1);
SINR2k = randi(10,10,1);
,你可能做:
Ratek = zeros(10,1); %// Important to preallocate memory to avoid growing vectors inside loops
for t=1:10
Ratek(t) = (1/2)*(log2(1 + SINR1k(t))+log2(1 + SINR2k(t)));
end
这比用一个空矩阵开始,增加新的元素,它一个更好的方法。然而,在MATLAB回路,能够避免这样的情况下,所以下面的行会给出相同的结果与上述循环:
Ratek = (1/2) * (log2(1 + SINR1k)+log2(1 + SINR2k));
n = 100; %// A bit bigger datasample
SINR1k = randi(100,n,1); %// Random numbers
SINR2k = randi(100,n,1); %// Random numbers
%//Approach 1, growing vectors:
tic
for ii = 1:1000 %// Several runs to account for warm-up etc.
Ratek = [];
for t=1:n
Ratek(end+1) = (1/2)*(log2(1+SINR1k(t))+log2(1+SINR2k(t)));
end
end
toc
Elapsed time is 0.291688 seconds.
%// Approach 2, pre-allocation:
tic
for ii = 1:1000 %// Several runs to account for warm-up etc.
Ratek = zeros(n,1);
for t=1:n
Ratek(t) = (1/2)*(log2(1+SINR1k(t))+log2(1+SINR2k(t)));
end
end
toc
Elapsed time is 0.070791 seconds.
%// Approach 3, vectorization:
tic
for ii = 1:1000
Ratek = (1/2)*(log2(1+SINR1k)+log2(1+SINR2k));
end
toc
Elapsed time is 0.056612 seconds.
如上图显示的基准测试结果,预分配使其速度提高了4倍以上,而矢量化则进一步提高了性能。
如果你真的只想要复制的结果:
tic
for ii = 1:1000
Ratek(1:n) = (1/2)*(log2(4)+log2(5));
end
toc
Elapsed time is 0.010811 seconds.
发生了什么变化你的循环? “SINR1k”和“SINR2k”标量还是1x10矢量?如果没有任何变化,'Ratek(1:10)=(1/2)*(log2(1 + SINR1k)+ log2(1 + SINR2k));'会是最简单的。 –