【问题标题】:How do I extract a vector from a column-major matrix in C?如何从 C 中的列主矩阵中提取向量?
【发布时间】:2014-05-11 22:45:24
【问题描述】:

来自 MATLAB 背景,我经常使用花哨的矩阵操作命令,例如 vec = matrix(:,1) 来提取,例如,matrix 的第一列作为向量。

将一些代码移植到 C 并需要将其与 FORTRAN 和 MATLAB 接口,现在我可以将矩阵存储在以列为主的单维数组中。

所以基本上,我正在使用宏

#define SUB2IND_2D(s1, s2, i1, i2) (s1)*(i2) + (i1)

和循环

for(size_t r=0; r<ROWS; ++r)
{
    for(size_t c=0; c<COLS; ++c)
    {
        size_t index = SUB2IND_2D(ROWS,COLS,r,c);
        // do something with matrix[index] here
    }
}

为了访问相应的矩阵。现在,我的问题是:如何在 C 中的这个框架内有效地从 matrix 中提取列或行向量,就像我在 MATLAB 中使用 matrix(:,1) 或 matrix(1,:) 或类似方法一样?

【问题讨论】:

  • 如何编写一些函数getRow(...),使用您发布的代码但用于固定r

标签: c matlab matrix


【解决方案1】:

假设您要提取第 2 列,将其命名为 ex_col:

int ex_col[];

for (size_t x=0; x<ROWS; x++)
{
size_t index = SUB2IND_2D(ROWS, COLS, x, 2); // fix column to 2 and extract all rows
ex_col[x] = matrix[index];
}

现在你可以将它泛化为一个函数

【讨论】:

  • 不客气 ;) 它一直发生在我身上,也别担心
【解决方案2】:

有点不清楚您要达到的目标。 vec(r,c) 将允许您访问特定元素。否则,您回答了自己的问题。 vec(:,r) 将提取您的行,而 vec(c,:) 将在您运行循环时提取您的列。

【讨论】:

  • 我知道如何在 MATLAB 中使用冒号命令。我的问题指向:如果矩阵存储在列优先数组中,我该如何在 C 中做同样的事情?
  • 我误解了你的问题。
猜你喜欢
  • 2014-12-29
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多