Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在下面的代码中有可能去掉循环吗?_Matlab - Fatal编程技术网

Matlab 在下面的代码中有可能去掉循环吗?

Matlab 在下面的代码中有可能去掉循环吗?,matlab,Matlab,您可以通过以下方式使用num2cell和deal: 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');

您可以通过以下方式使用
num2cell
deal

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

你要找的线路是:

% 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{:});

您可以在此了解更多信息

如果您将矩阵
M
转换为具有正确维度的单元格数组,则可以使用
结构的向量化版本
构造函数:

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

编辑:在调用
mat2cell
时,将
COLS
替换为
ROWS
。我在测试中混淆了尺寸大小…

你确定你的答案吗?我忘记了一个警告:这只适用于数字数组。但除此之外,是的,我确信。你有什么错误?编辑:是的,我的错误,输入的代码我会更新它。兄弟,这个代码没有达到同样的效果。我试过了。
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