2015-07-02 49 views
-2

我想在函数的开头定义一个索引变量,以便随后索引几个向量。索引应指向特定元素(例如元素nr 3)或指向矢量的最后一个条目。Matlab对特定元素或最后一个元素的索引变量

我希望能够使索引变量字符串和评估它。

在特定元素的情况下,这将是:

idx = '3'; 
vector1(eval(idx)) 
vector2(eval(idx)) 

这工作。但对于最后一个元素的方法失败:

idx = 'end'; 
vector1(eval(idx)) 
vector2(eval(idx)) 

一样的eval(“端”),它引发以下错误:

Error: Illegal use of reserved keyword "end".

有谁知道一个解决方案是如何建立一个索引变量,以便它可以索引到特定元素或具有未知大小的向量的最后一个元素?

谢谢!

+3

什么是制作索引变量“的字符串”的目的是什么?我不明白刚使用'vector(end)'有什么问题。这就是'end'关键字的作用。你使用'eval'意味着'end'是不允许的变量。无需将其作为变量存储,无论如何你都不能。这是一个**保留的**关键字。降低我的(删除)答案无助于解决您的问题。很多其他的MATLAB用户会问你同样的问题。 – rayryeng

+0

为什么让索引变量为一个字符串? – Setsu

+1

首先,摆脱字符串索引。其次,使用'length(vector1)'或'length(vector2)'明确地建立索引向量。如果这意味着您将无法使用相同的索引向量,请开始考虑其他解决方案,如索引生成函数。 – Peter

回答

1

你的问题是你正在尝试做两件不同的事情。在一种情况下(将idx定义为标量),您正在访问每个向量中的相同元素。在第二种情况下,您要求MATLAB可能访问每个向量中的不同元素(除非您确定每个向量具有相同的长度)。你将不得不对待每个案件。你可以写一个子函数,做这样的事情

function element = return_element(vector, idx) 
if idx <= 0 
    element = vector(end); 
else 
    element = vector(idx); 
end 
end 

你会这样称呼它:

idx = -1; 
% lots of code 
return_element(vector1,idx); % = vector1(end) 
return_element(vector2,idx); % = vector2(end) 

idx = 3; 
% lots of code 
return_element(vector1,idx); % = vector1(3) 
return_element(vector2,idx); % = vector2(3) 
+0

我希望避免所有的if语句,并以一种智能的方式将其打包在一个索引变量中,以使其更优雅。也许这是不可能的。 – solimanelefant

+1

我不认为这是可能的。在第一种情况下,您的索引是静态的,第二种情况下是动态的。这就是为什么我建议将if语句包装到子函数中,因为那样你只需要包含它一次。 – craigim

+3

不是我推荐它,但它是可能的;基本上你必须做[运算符重载](https://en.wikipedia.org/wiki/Operator_overloading)的MATLAB等价物(定义一个classdef类,并根据你的喜好覆盖'subsref'和'subsasgn') ...否则,你将不得不接受现有的语法索引到矩阵。例如,最近MATLAB版本中的'table'数据类型就有类似的功能。 – Amro

相关问题