在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));'會是最簡單的。 –