【问题标题】:MATLAB: ceate a x b matrix (or 2D array) from 2 1Darrays, and populate each cell from another arrayMATLAB:从 2 个 1Darrays 中创建一个 x b 矩阵(或 2D 数组),并从另一个数组中填充每个单元格
【发布时间】:2014-08-15 19:54:43
【问题描述】:

我正在使用 MATLAB。

所以我有 3 个数组;说a,b,c。 a和b代表距离,c代表在(a,b)点有特定值的变量。

我一直在尝试创建一个由 (b x a) 单元组成的矩阵,并用 c 的值填充它,以便对其进行图像、热图等。

但是我遇到的问题是 a 和 b 有很多重复值; a 保持固定,然后遍历 b 的所有值,然后移动到 a 的下一个值,依此类推。 a 和 b 的范围是固定的,并且总是在等间距的值之间进行迭代。

以下是我为此创建的代码。所以它似乎不起作用,我没有想法。

z_true_len = length(unique(a)); %number of z distances
r_true_len = length(unique(b)); %number of r disatances
data_matrix = zeros(r_true_len,z_true_len); %create r x z matrix, full of 0s
z_past = 0; 
r_past = 0;
z_count = 1;
r_count = 1;
for count = 1: length(a)
    z_current = a(count);
    if z_past ~= z_current
        data_matrix(1:z_count) = c(count);
        z_past = z_current;
        z_count = z_count + 1;
        r_count = 1;
    else
        data_matrix(r_count:z_count) = c(count);
        r_count = r_count + 1;
    end      
end    

data_matrix

如有任何帮助,将不胜感激

【问题讨论】:

  • 你能举个小例子吗?
  • 当然,说; a=(1 1 1 2 2 2) b=(1 2 3 1 2 3) c=(1 2 3 4 5 6) 那么它会返回 data_matrix=(1 4, 2 5, 3 6)
  • 请看我的回答。我假设您的意思是 [1 4; 2 5; 3 6] 代表 data_matrix

标签: arrays matlab matrix populate


【解决方案1】:

我将ab 数组映射到整数空间中:

% Data
a = [ 0.5 0.5 2.5 0.5 2.5 2.5 4.5 4.5 4.5 2.5 4.5 0.5];
b = [-35 -25 -25 -15 -45 -35 -35 -45 -15 -15 -25 -45];
c = [2 1 -2 4 6 4 6 8 4 1 -5 2];

% Mapping from real to integers
a_unique = sort(unique(a));
b_unique = sort(unique(b));
a_idx = zeros(size(a));
b_idx = zeros(size(b));
for ii = 1:numel(a_unique),
    a_idx(a_unique(ii)==a) = ii;
end
for ii = 1:numel(b_unique),
    b_idx(b_unique(ii)==b) = ii;
end

% Create matrix
data_matrix = zeros(numel(b_unique),numel(a_unique));
for count = 1:length(a_idx),
    data_matrix(b_idx(count),a_idx(count)) = c(count);    
end  

% Plot
figure;
imagesc(data_matrix);

【讨论】:

  • 不,不幸的是,所有的 a、b 和 c 都不仅仅包含整数。我得到“尝试访问 data_matrix(0.005,-0.09833);索引必须是正整数或逻辑。”作为错误消息。
【解决方案2】:

您基本上需要使用适当的尺寸定义data_matrix,然后使用linear indexing 填充值(参见sub2ind):

m = max(b); %// number of rows in result
n = max(a); %// number of columns in result
data_matrix = NaN(m,n); %// define result matrix with appropriate dimensions
data_matrix(sub2ind([m n], b, a)) = c; %// fill values using indexing

如果ab不总是包含整数:先用unique的第三个输出转换成“整数标签”,然后按照上面的操作:

[~, ~,  bb] = unique(b); %// get integer labels for b
[~, ~,  aa] = unique(a); %// get integer labels for a
m = max(bb); %// number of rows in result
n = max(aa); %// number of columns in result
data_matrix = NaN(m,n); %// define result matrix with appropriate dimensions
data_matrix(sub2ind([m n], bb, aa)) = c; %// fill values using indexing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2017-09-18
    相关资源
    最近更新 更多