【问题标题】:Matlab: reshape 4-d matrix to 2-d and maintain order, how to?Matlab:将 4-d 矩阵重塑为 2-d 并保持顺序,如何?
【发布时间】:2018-01-31 20:53:11
【问题描述】:

我正在尝试使用 California ND Datastet 实现 vlsh,它由 701 张照片组成。 10 个主题在一个 txt 文件中记录了哪些照片几乎是重复的,我们也有相关矩阵。 图像是 RGB 的,我将它们缩小为 20x20。我创建了一个 20x20x3x701 的 4 维数组。于是我尝试reshape,得到一个1200x701的矩阵,但问题是reshape不能保持原矩阵的顺序。 我尝试在线搜索,大多数建议是使用“Permute”,但在我看来这不适合我的情况。

我可以贴出matlab代码:

`
path='C:\Users\franc\Desktop\stage\californiaND\prova*.jpg';
path2='C:\Users\franc\Desktop\stage\californiaND\prova';
d=dir(path);
a=[];
for m=1:length(d)
  a=cat(4,a,imread(strcat(path2,d(m).name)));
end
r=reshape(a,[],701);
r=double(r);
L = lshConstruct( r, 10,4);`

【问题讨论】:

  • 您希望数据相对于输入的顺序是什么?
  • 我希望将同一图像的每个矩阵连接起来。所以一个 1200 像素的矩阵,用于 701 张图像。
  • 是的,但是第 2 和第 3 维应该按什么顺序折叠到第 1 维中?重塑不会随机化顺序...
  • 看起来问题是你创建了一个 4D 矩阵......从一开始就创建你想要的,而不是从 4D 矩阵
  • @AnderBiguri 我该怎么做?我在 3 通道中有二维矩阵。无论如何,我必须重塑,或者至少我认为。你能帮助我吗?还是谢谢你

标签: matlab matrix multidimensional-array reshape locality-sensitive-hash


【解决方案1】:

我假设您需要 RGBRGB 格式的一维向量,否则解决方案将很简单(只需 (:))。

假设imread 正在一张一张地读取 20x20x3 的图像,这就是您直接制作 2D 矩阵的方式:

for m=1:length(d) % this is 701, right?
  im=imread(strcat(path2,d(m).name));
  im=permute(im,[3 1 2]);
  a=cat(2,im(:));
end

【讨论】:

  • 这正是我想要的,非常感谢。当我将您的方法应用于 2 x 2 x3 图像而不是 20 x 20 x 3 时,我将尝试解释。 iim2(:,:,1) = 113 85 108 81 iim2(:,:,2) = 100 72 95 68 iim2(:,:,3) = 107 79 102 75 这是我执行代码时得到的最后一张图片。如果我能得到这个:113 108 85 81 100 95 72 68 107 102 79 75 我想我已经解决了我的问题。相反,我得到了这个:113 100 107 108 95 102 85 72 79 81 68 75。
  • 为此,只需使用iim2(:) 而不是permute。但那是 RRRBBBGGG。
  • @FireFox1616 是的,乔恩说的。考虑接受答案为有效
  • 非常感谢你们两位。现在 lsh 算法终于起作用了。真的谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多