2014-07-19 104 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.