2014-07-25 25 views
4

想象一下下面的結構:通過函數到現有的結構或變量添加字段,不重命名或破壞原有結構

A.B1 = 1:42; 
A.B2 = 'Hello World!' 

現在我希望做一些操作,但備份在新substruct現有的數據。

A.B1.C1 = A.B1; 
A.B1.C2 = mean(A.B1.C1); 

這兩條線路(作爲一個例子),我想投入的函數,因此我的腳本將如下所示:

A.B1 = 1:42; 
A.B2 = 'Hello World!' 
myfunction(A.B1) 

和我的工作空間應該事後看起來像:

A = 

    B1: [1x1 struct] 
    B2: 'Hello World!' 

A.B1 = 

    C1: [1x42 double] 
    C2: 21.5 

但我無法設法創建該功能,我的原始結構A沒有被破壞。除此之外,我的功能輸入可能是W.X.Y,我想在此之後獲得W.X.Y.Z1W.X.Y.Z2。此外,它可能是一個簡單的矢量A = 1:42,之後應該是A.B1A.B2

任何建議?

我可以用fieldnamesassignin('base',...)來構建一些醜陋的東西 - 但這真的是一種方式嗎?


編輯:一個主要的問題還在於,功能inputname不工作的結構。所以如果我通過A我的功能,然後我可以使用fieldnames獲得B1B2的名稱,但我找不到什麼是最初的字段名稱「A」。如果A將變量inputname(1)在我的功能將返回'A'。對於結構體,輸出是空的。


類和方法會是解決方案嗎?不幸的是我不熟悉的OOP在所有...

+0

難道我說得對,這個問題可以歸結爲:如何找出水平/域的數量在'struct',這樣我可以分配一個額外的級別? – Schorsch

+0

@Schorsch:對於「難看」的方法是的,另外需要找出所有字段名並通過'assignin'將它們寫回工作區。我可以做到。但我正在尋找更優雅的通用解決方案。 – thewaywewalk

+0

@ Schorsch,實際上即使這很棘手,請參閱我的編輯。 – thewaywewalk

回答

3

我唯一看到的可以是類似的東西:

function [out] = myfunction(in) 

    out.base = in; 
    out.compute = mean(in); 

end 

當你要與你的函數工作,你必須提供相同的輸入/輸出變量是這樣的:

A.B1 = 1:42; 
A.B2 = 'Hello World!' 
A.B1 = myfunction(A.B1); 

也可能的多個輸入:

function [varargout] = myfunction(varargin) 

for ii = 1:nargin 

    out.base = varargin{ii}; 
    out.compute = mean(out.base); 
    varargout{ii} = out; 

end 

end 

只要輸出變量是符號等於其根據輸入變量:

W.X.Y1 = 1:42; 
W.X.Y2 = 'Hello world!'; 

A.B1 = 100:-1:0; 
A.B2 = 'Goodbye cruel world!' 

[W.X.Y1,A.B1] = myfunction(W.X.Y1,A.B1) 
+0

我認爲你是對的。我剛剛閱讀了編輯,很確定,這是行不通的。 – Vuwox

+0

@Schorsch它實際上會工作:'W.X.Y1 = myfunction(W.X.Y1)' - 但我會需要它的多個輸入,我會試試看。 – thewaywewalk

+0

對於任何matlab函數,你可以有多個輸入/輸出。只要確定你在做什麼,這很好。問題,你需要小心,並保持同級結構之間的結構。所以水平不能真的是a.b.c.d.但是像我一樣,例如:'a.base.base.base.compute' – Vuwox

相關問題