我在MathWorks公司博客關於MATLAB函數式編程閱讀this article,以及兩個輔助功能有:實施「花」和「訪問」「鏈接」功能的MATLAB
paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};
明顯的第三個完成三重奏(並與五個字母的主題保持一致)是:
acces = @(x, field) x.(field);
把它是否是實現這種方式還是不能在MATLAB一邊(注意鏈是一個好主意的討論:八度支持鏈接默認),paren
如預期的那樣似乎運作良好;然而,curly
和acces
有一個主要缺點;考慮下面的代碼:
>> C = {1,2,3,4; 2,3,4,5; 3,4,5,6; 4,5,6,7};
>> A = [curly(C, 3, ':')]
A =
3
即預期序列代並沒有發生。
(注意,此代碼將按預期在八度,即A = [3,4,5,6]
)
同樣,acces
不會在MATLAB產生序列
>> S = [struct('name', 'john'), struct('name', 'jim')];
>> A = {acces(S, 'name')}
A =
'john'
(而倍頻產生預期A = {'john', 'jim'}
)
我瞭解這種差異可能更多的是在執行方面的問題a。函數如何返回matlab vs octave中的內容,和/或b。如何從兩種語言的單元格和結構中生成序列。
但是,有沒有一種程序化的方式來讓matlab執行上面的預期操作?
換句話說,有沒有一種方法可以定義curly
和acces
函數返回一個序列(額外獎金爲匿名函數:p)像八度呢?
PS。我正在尋找的答案不是微不足道的 「獲取多個參數使用可變參數」之一。
PS2。
我不知道「_dot」和「_brace」 ,知道這很酷! 也謝謝你糾正我的結構語法,我沒有費心查找它,哈哈。儘管我猜想,很好的解決方法會使可讀性比'paren'和'curly'更糟糕,這已經足夠令人質疑了......在matlab中沒有辦法避免那個血腥的臨時變量,是否存在:p –
still,I不知道matlab如何從引擎蓋下的單元/結構創建序列,以便它在直接調用時工作,但不在用subsref調用時工作。當我嘗試使用subsref並且它不工作時,我感到非常驚訝...直到那時,我的印象是()和{}索引只是subsref的語法糖......(例如,在octave,subsref,按預期工作並返回一個序列) –
@TasosPapastylianou通過'subsref'做了更多的探索,並在我的答案中添加了一些信息。雖然你可以強制使用'subsref'來給你所有的值,但是仍然不容易得到逗號分隔列表。 – Suever