【问题标题】:How can I combine two arrays of vector components into an array of vectors in matlab如何在matlab中将两个向量分量数组组合成一个向量数组
【发布时间】:2017-04-17 16:32:04
【问题描述】:

我有两个大小相同的数组,uxuy,我想将它们组合成一个向量元胞数组,这样U(1,1) 包含一个由uy(1,1),ux(1,1) 和`numel(U) 组成的向量=numel(ux)=numel(uy)'

分量uxuy代表图像梯度的单位向量。组件数组是通过元素乘法创建的:

ux = I1x./I1mag;
uy = I1y./I1mag;

我需要能够多次访问每个向量,并将它们作为dotcross 的参数调用,并且创建一个向量数组会比为每个向量创建一个临时向量更快、更方便每次迭代都会调用它。

谢谢

为进一步清晰编辑:

假设我有一个数组

uy = (1,2,3;4,5,6);

和另一个相同大小的数组

ux = (9,8,7;6,5,4);

我需要 yx 向量,所以对于我们的示例来说是

([1,9], [2,8], [3,7]; [4,6], [5,5], [6,4])

请问最有效的方法是什么?我将获得每个像素与其相邻像素的点积,反之亦然,因此每个向量将被使用 16 次,整个数组包含大约 10^4 或 10^5 个元素...

感谢您一直以来的帮助。

【问题讨论】:

  • 您希望元胞数组为numel(uy) x numel(ux)吗?
  • 假设ux 有一列[ux, uy]。否则,[ux', uy']。或者,[ux; uy]'
  • 感谢您的建议。我将编辑帖子以澄清-我想要numel(U)= numel(ux)= numel(uy),但是U的每个单元格都包含一个向量[uy,ux]。
  • 为什么需要一个元胞数组?如果所有元素的大小都相同,则多维数组会更容易处理。
  • 我需要能够调用点积和叉积的向量......能够得到像点(U(x,y),U(a,b))这样的东西会很方便.否则我可以将它称为 U1 = [U(x,y,1), U(x,y,2)] 然后 dot(U1, U2),但这不会更慢吗?

标签: arrays matlab vector cell-array


【解决方案1】:

您可以创建两个图层。一层包含 ux,另一层包含 uy

ux = [10 8 7;6 5 4];
uy = [1 2 3;4 5 6];

xy(:,:,1) = ux; // [10 8 7;6 5 4]
xy(:,:,2) = uy; // [1 2 3;4 5 6]

aaa=xy(1,1,:); // [10 1]
bbb=xy(1,2,:); // [8 2]

dot(aaa,bbb)

结果将是:

82

【讨论】:

  • 感谢您的建议。不幸的是,ux 和 uy 是标量值的矩阵。我想把它们做成向量,放到矩阵中……还是我误会你了?
  • 嗨,不抱歉,我仍然坚持这一点。我想我错误地传达了我正在寻找的东西,而且这个问题相当混乱。我不是想要完整地调用 ux 和 uy,而是从每个元素中获取标量值,将它们组合成一个向量,然后将该向量保存为数组中的一个元素。
  • 好的 - 我每次使用时都必须明确地将每个向量分配为变量?那是我想避免的,因为我在一个循环中执行此操作,每个循环都会被调用几次,也许没关系,或者我只需要重新考虑如何完全做到这一点。 .
  • 如果 ux 和 uy 为常数矩阵,则不需要将每个向量分配为变量。可以直接调用call dot(xy(1,1,:),xy(1,2,:))
  • 是的,这行得通 - 感谢您抽出宝贵时间提供帮助。
【解决方案2】:

如果你真的希望它是一个单元格向量,其中每个元素都是一个[1 x 2] 向量,请使用mat2cell

ux = rand(15,1);
uy = rand(15,1);
U = [ux, uy];
K = mat2cell(U,ones(size(U,1),1),2);

但正如其他人指出的那样,U = [ux, uy] 就足够了,因为您只需调用 U(1,:) 即可获得完全相同的结果,而不必担心单元格。

如果您想计算两个向量上的 dot 乘积,arrayfun(@dot,ux,uy) 会按元素完成这项工作。

【讨论】:

  • aha - arrayfun 可能就是问题所在。不过,我不是在寻找 ux 和 uy 的点 - 我在寻找由 ux 和 uy 的相应元素组成的向量的点积 - 比如[ux(m,n), uy(m,n)].[ux(p,q), uy(p,q)]
  • 如果你能给我你的向量包含的例子,我可能会给出一个更清晰的答案。您可以使用来自uxuy 的一些示例来编辑您的原始帖子。
  • 尝试使用 600x300 的测试图像,因此 ux 和 uy 是 600x300 的标量值数组。 doingU = [ux, uy]; 给了我一个 300x1200 的数组,U(1,:); 给了我一个 1x1200 的标量值数组。我在这里错过了什么?
  • 到目前为止,我一直认为uxuy 是数组。由于[ux, uy] 是按列连接,这很好,假设uxuy 是列向量。如果它们是矩阵,当然你必须在第三维中连接它们。这可以使用U=cat(3,ux,uy) 完成,然后您分别使用U(i,j,1)U(i,j,2) 访问它们。
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多