【问题标题】:Matlab indexing variable for a specific element or the last element特定元素或最后一个元素的 Matlab 索引变量
【发布时间】:2015-07-02 17:45:20
【问题描述】:

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

我希望能够将索引变量设为字符串并对其进行求值。

如果是特定元素,它将是:

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

这行得通。但是对于最后一个元素,该方法失败了:

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

和eval('end')一样,会抛出如下错误:

错误:非法使用保留关键字“end”。

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

谢谢!

【问题讨论】:

  • 将索引变量设为“字符串”的目的是什么?我不明白仅使用vector(end) 有什么问题。这就是 end 关键字的用途。您对eval 的使用意味着end 在不允许时是一个变量。无需将其存储为变量,而且您也不能。这是一个保留关键字。否决我(已删除)的答案无助于解决您的问题。许多其他 MATLAB 用户会问你同样的问题。
  • 为什么要将索引变量设为字符串?
  • 首先,摆脱字符串索引。其次,使用length(vector1)length(vector2) 显式构建索引向量。如果这意味着您将无法使用相同的索引向量,请开始考虑其他解决方案,例如索引生成函数。
  • 如果真的必须使用eval,有一种方法。有 Matlab 函数返回向量或数组的长度或大小。但更好:编写一个完全符合您需要的实现,这比使用 eval 和字符串 (!) 作为索引变量要好。
  • 好吧,如果您准备好使用eval,请充分使用它:idx = 'end'; eval(['vector1(' idx ')']) 将运行良好且不会产生错误。我仍然同意其他所有人的观点,这绝对不是要走的路。

标签: matlab vector indexing


【解决方案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)

【讨论】:

  • 我希望避免所有的 if 语句,并以一种巧妙的方式将其打包在一个索引变量中,使其更加优雅。也许真的不可能。
  • 我认为不可能。在第一种情况下,您的索引是静态的,在第二种情况下,它是动态的。这就是为什么我建议将 if 语句打包到一个子函数中,因为这样你只需要包含它一次。
  • 不是我推荐的,但有可能;基本上你必须做operator overloading的MATLAB等价物(定义一个classdef-class,并根据你的喜好覆盖subsrefsubsasgn)......否则你将不得不接受现有的语法来索引矩阵。例如,最近的 MATLAB 版本中的 table 数据类型有类似的作用。
  • 另外你应该知道A(..,end,..)被翻译成builtin('end',A,k,n):mathworks.com/help/matlab/matlab_oop/object-end-indexing.html,所以end不能单独使用,它需要知道尺寸和大小它出现的数组表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2013-07-30
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多