2017-05-10 2 views
2
function [lines1, max_vertex1] = matrix_to_arg(matrix1) 
% convert a matrix into a vector of line-structs 
% and, one vector. 
[ROWS, COLS] = size(matrix1); 

if(~(COLS==10)) 
    fprintf('matrix1 must have 10 columns\n'); 
    return; 
end 

max_vertex1 = matrix1(1, 7:10); 
M = matrix1(:, 1:6); 

    for i=1:ROWS 
     lines1(i) = struct('point1', M(i,1:2), ... 
       'point2', M(i,3:4), ... 
        'theta', M(i,5), ... 
        'rho', M(i,6)); 
    end 
end 

答えて

1

次のようにnum2celldealを使用することができます。

まあ
% random data 
M = rand(5000, 6); 
% split each row to cell 
point1 = num2cell(M(:,1:2),2); 
point2 = num2cell(M(:,3:4),2); 
theta = num2cell(M(:,5),2); 
rho = num2cell(M(:,6),2); 
% init struct 
lines1 = struct('point1',[],'point2',[],'theta',[],'rho',[]); 
lines1(size(M,1)).point1 = []; 
% deal data to struct 
[lines1(:).point1] = deal(point1{:}); 
[lines1(:).point2] = deal(point2{:}); 
[lines1(:).theta] = deal(theta{:}); 
[lines1(:).rho] = deal(rho{:}); 
0

あなたが探している行はこれです:

lines1 = arrayfun(@(i) struct('point1', M(i,1:2), 'point2', M(i,3:4), 'theta', M(i,5), 'rho', M(i,6)), 1:ROWS); 

あなたがここにarrayfun

0
についての詳細を学ぶことができます

行列Mを正しい次元のセル配列に変換すると、

function [lines1, max_vertex1] = matrix_to_arg(matrix1) 
% convert a matrix into a vector of line-structs 
% and, one vector. 
[ROWS, COLS] = size(matrix1); 

if(~(COLS==10)) 
    fprintf('matrix1 must have 10 columns\n'); 
    return; 
end 

max_vertex1 = matrix1(1, 7:10); 
M   = mat2cell(matrix1(:, 1:6),ones(1,ROWS),[2 2 1 1]); 

lines1  = struct('point1', M(:,1), ... 
        'point2', M(:,2), ... 
        'theta', M(:,3), ... 
        'rho', M(:,4)); 
end 

EDIT:あなたはstructコンストラクタのベクトル化バージョンを使用することができますmat2cellへの呼び出しでROWSCOLSを置き換えます。私はテストで次元の大きさを混乱させました...

+0

あなたの答えは本当ですか? – anonymous

+0

さて、私は1つの注意点を忘れました。これは数値配列に対してのみ機能します。しかしそうでなければ、はい、私は確信しています。どのようなエラーが出ますか?編集:はい、私の悪い、私はそれを更新するコードの入力ミス。 – souty

+0

Broは、このコードは同じを達成していません。私はそれを試してみました。 – anonymous

関連する問題