【问题标题】:Reshaping a 3d matlab matrix into 2d matrix with indices and values将 3d matlab 矩阵重塑为具有索引和值的 2d 矩阵
【发布时间】:2018-06-25 13:44:48
【问题描述】:

我在 MATLAB 中有一个 3D 矩阵。它有 3 行、4 列和 2 个时间范围。请查看数据集:

>> size(filtered_data)
ans =
 3     4     2

>> filtered_data
filtered_data(:,:,1) =
 15     22     19     16
 15     15     13     17
 19     20     17     17

filtered_data(:,:,2) =
 14     17     14     10
 18     19     11     18
 16     15     14     17

我想将此 3D 矩阵的所有值及其索引存储到二维变量中。

这看起来像这样

我尝试使用find() 函数,但它返回多个索引,并且它要求您输入一个值,您需要为其计算索引。

这个问题有预定义的 MATLAB 函数吗?

我将不胜感激。

【问题讨论】:

    标签: matlab transform reshape matrix-indexing


    【解决方案1】:

    我不相信有一个内置的 MATLAB 函数可以做到这一点,但你自己做很容易:

    sz = size(filtered_data);
    [x,y] = meshgrid(1:sz(2),1:sz(1));
    output = [x(:).';y(:).';reshape(filtered_data(:),[],sz(3)).'];
    

    【讨论】:

    • 确实如此。我从不处理复杂的数据,所以出于懒惰,我养成了只使用' 而不是.' 的坏习惯。我已经编辑了答案来解决这个问题。
    • 其实我的数据集很大,如何让这段代码动态化。这样它就可以运行 ijk 维数据集
    • 我修改了答案以消除对数据大小的显式依赖
    【解决方案2】:

    这并不神秘。它只是重塑数据并根据大小生成索引的事实。

    rows=repmat(1:size(filtered_data,1),1,size(filtered_data,2));
    cols=repelem(1:size(filtered_data,2),size(filtered_data,1));
    data_time_frame1=reshape(filtered_data(:,:,1),1,[]);
    data_time_frame2=reshape(filtered_data(:,:,2),1,[]);
    

    为了更灵活的方法,

    data_time_frame=reshape(filtered_data(:),size(filtered_data,3),[]);
    

    只需用这些操作填充一个矩阵。也需要一些时间来熟悉它们,以备将来参考

    【讨论】:

    • 我需要硬编码我的时间范围值吗?我想在n 时间范围内运行此代码。如何使这段代码动态化?
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2013-09-21
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多