2017-02-13 1 views
0

Ich versuche in der zweiten Dimension eine Matrix QI in Matlab zu summieren. Der Trick ist, die Spalten enthalten eine Reihe von steigenden Zahlen, aber nicht alle Spalten haben die gleiche Anzahl von Elementen (d. H. Numel (QI (:, 1)) ~ = numel (QI (:, 2)) und so weiter). Der Übersichtlichkeit halber füge ich ein Bild davon bei. Beachten Sie, dass ich die fehlenden Bereiche mit 0 aufgefüllt habe, sodass die vorherige Bedingung nnz (QI (:, 1)) ~ = nnz (QI (:, 2)) wird.Wie summiere ich eine Matrix mit nicht ausgerichteten Elementen?

Matrix QI

Eine erste Strategie, die ich dachte, war dies als ein Bild zu behandeln und eine Maske für jede unterschiedliche Gradientenniveau zu konstruieren, aber das scheint wie eine mühsame Arbeit.

Colored QI

Jeder hat eine bessere Idee, wie dies zu tun? Ich sollte auch erwähnen, dass ich frei modifizieren kann, wie QI generiert wird, aber ich würde lieber nicht, wenn es eine Lösung für dieses Problem gibt.


EDIT:

Hoffentlich wird das neue farbige Bild sollte ein besseres Verständnis geben.

FYI, jede Spalte wurde zuvor in einem Zellenfeld ohne die abschließenden Nullen gespeichert. Dann extrahierte ich die Spalten einzeln und speicherte sie in einer Matrix, um die Summierung durchzuführen, und füllte die zusätzlichen Nullen auf, wenn die Länge nicht dieselbe war.

Im Allgemeinen sollten diese Spaltendaten die gleiche Anzahl von Zeilen haben, aber manchmal ist das nicht der Fall, und noch schlimmer, sie sind nicht korrekt.

Ich fange an zu denken, wenn es besser ist, den Code zu überarbeiten, der die Zellenarrays anstatt diese Matrix erzeugt. Gedanken?

Danke,

+1

Also, was ist das Problem? Summe der Zeilen (oder wollten Sie in der ersten Dimension summieren?) Und die Nullelemente tragen nicht zur Summe bei. – beaker

+0

Ich hätte das gemacht, außer dass es das Problem nicht löst. Ich werde es versuchen und neu formulieren. – KaiserHaz

+0

Ja, Sie müssen die Art der Datenkonvertierung ändern. Abhängig von der Struktur des Zellenarrays müssen Sie möglicherweise nicht einmal die vollständige Matrix erstellen, aber es gibt keine Möglichkeit, ohne weitere Informationen zu wissen. – beaker

Antwort

0

bearbeiten: Nach Sie einen Kommentar, ich geändert, um die Antwort. Beachten Sie, dass Ihre Daten nicht wirklich "ausgerichtet" werden können, da sie nicht die gleiche Anzahl an Werten haben.

Ein Weg wäre, eine Zelle als Speicher für Ihre Maßnahmen zu verwenden.

valueMissing = 0; % here you can put the defauld value you want 

% transform you matrix in a cell 
QICell = arrayfun(@(x) QI(QI(:,x)!=valueMissing,x), 1:size(QI,2),'UniformOutput', false); 

Jetzt können Sie das letzte Element der Vektoren in der Zelle Summe

QIsum = sum(cellfun(@(x) x(end), QICell)) 

Oder die Vektoren neu anordnen, so dass Ihre letzte Element „ausgerichtet“ sind

QICellReordered = cellfun(@(x) x(end:-1:1),QICell, 'UniformOutput',false); 

Dann können Sie mache alle möglichen Summen:

m = min(cellfun(@numel, QICellReordered)); 
QIsum = zeros(m,1); 

for i=1:m 
    QIsum(i) = sum(cellfun(@(x) x(i), QICellReordered)); 
end 

% reorder QISum to your original order 
QIsum = QIsum(end:-1:1); 

Ich hoffe diese Hilfe!

+0

Danke für deine Antwort, aber ich fürchte, es ist die 2. Dimension (dh von links nach rechts). Ich werde die Frage neu formulieren. – KaiserHaz

+0

Ok, siehe meine Bearbeitung ... – beesleep