2013-10-30 42 views
1

我想僅使用一次變量的修改版本(不更改原始版本),所以我不想將它保存在新變量中。我可以在Matlab中創建一個新的變量嗎?

例如:

a = [1 -2 3]; 
copy = a; 
copy(a < 0) = 0; 
b = [4 5 6] .* copy; 

我可以簡化到像下面這樣?

a = [1 -2 3]; 
b = [4 5 6] .* a(<0 = 0); 

編輯

上面的例子僅僅是一個例子。一般問題是如何獲取下面的代碼生成的copy,而不創建它。

% `a` is a vector 
% `cond` is a logical vector such as `size(a) == size(cond)` 
% `num` is a number 
copy = a; 
copy(cond) = num; 
+1

有*總是*用不同的方式來表達,而不USI問題一個臨時變量。在某些情況下,您會犧牲可讀性,而在其他情況下,您會提高可讀性。在性能不是問題的情況下,我說去尋找最可讀的解決方案。一種可能性是'B = [4 5 6]。*一。*(一> = 0)' – nispio

+0

@nispio謝謝,我沒有想過由其邏輯一個向量乘以。您的想法幫助我找到了一般問題的[解決方案](http://stackoverflow.com/a/19695519/1529630)。 – Oriol

回答

1

對於一般問題

% `a` is a vector 
% `cond` is a logical vector such as `size(a) == size(cond)` 
% `num` is a number 
copy = a; 
copy(cond) = num; 

代替創建copy,下列操作之一,可以使用:

  • a + (-a+num) .* cond

  • a .* ~cond + num * cond

警告:如果num是以下中的一個不工作:naninf-inf(也許更多)

性能

似乎a + (-a+num) .* cond更快:

a = rand(1, 10000); cond = a < 0.5; num = 10; 

tic; for i=1:100000 a + (-a+num) .* cond; end; toc; 
% Elapsed time is 14.764796 seconds. 

tic; for i=1:100000 a .* ~cond + num * cond; end; toc; 
% Elapsed time is 29.842845 seconds. 
0

我不認爲你正在尋找的語法存在於Matlab中。

顯然,你的實際使用情況可能比這更復雜,但我想你的代碼改成這樣,除去多餘的copy變量:

a = [1 -2 3]; 
b = [4 5 6] .* a; 
b(a < 0) = 0; 

參見:http://www.mathworks.com/matlabcentral/answers/25235

2

在這種特殊情況下, ,你可以做

b = [4 5 6] .* max(0, a) 

但你爲什麼問這個?當你用大矩陣做類似的事情時,你是否想要節省內存?或者你想寫更緊湊的代碼?

0

可以與應用所需的修改您的變量的anonymous function做到這一點:

f = @(x) max(x,0); % this will apply the desired operation to a 
a = [1 -2 3]; 
b = [4 5 6] .* f(a); 

a所需的修改必須足夠簡單,以便它可以使用匿名函數來定義。具體而言,根據上述鏈接,

匿名函數只能包含一個可執行語句。

+1

我一直覺得有點奇怪稱之爲匿名函數,一旦你給它一個名稱... – nispio

+0

@nispio我傾向於同意。但根據Mathworks的說法,「f」是函數句柄的名稱,而不是函數本身。 http://www.mathworks.es/es/help/matlab/matlab_prog/anonymous-functions.html –

+0

然而你可以調用使用'F(參數)的函數'。如果它看起來像一個功能,叫聲也像功能...在另一方面,它可能會混淆的問題更說,當'F = @(參數)...'它是一個匿名函數時爲傳遞通過'f(args)'調用的另一個函數的參數,而是一個「named」函數。 – nispio

相關問題