2013-10-30 90 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

相关问题