2015-07-02 51 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

相關問題