2014-07-19 106 views
0

在MATLAB中,如果我有一个计算的东西率在for循环中这样在matlab中,如何连接for循环中计算的值?

for t=1:10 
Ratek=(1/2)*(log2(1+SINR1k)+log2(1+SINR2k)); 
end 

每一次的速度不同的价值,我想在来连接这个速度的所有值码在每个循环中,以便在第10个循环之后,我计算出10个速率来使用它们。我怎样才能做到这一点 ?

+0

发生了什么变化你的循环? “SINR1k”和“SINR2k”标量还是1x10矢量?如果没有任何变化,'Ratek(1:10)=(1/2)*(log2(1 + SINR1k)+ log2(1 + SINR2k));'会是最简单的。 –

回答

1

这个怎么样,建立在@勒夫的回答是:

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,但是这是我的起飞。

1

我假设你想连接计算结果到一个向量;然后您可以分配给Ratek(end+1)来追加该值;

Ratek = [] 
for t=1:10 
    Ratek(end+1) = (1/2)*(log2(1+SINR1k)+log2(1+SINR2k)); 
end 

(假设实际计算每次静态实例,而不是给出一个单独的值)作为一个侧面说明,越来越多的载体和循环可能真的伤害了性能,如果你这样做频繁,所以要注意的性能影响。

1

如果你的数据是静态的,你只希望不要重复相同的结果10次,然后

Ratek(1:10) = (1/2)*(log2(1 + SINR1k)+log2(1 + SINR2k)); 

但是,这不会是多大用处的,所以我会认为SINR1kSINR2k是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.