连接一个2D数组

本文关键字:一个 2D 数组 连接 | 更新日期: 2023-09-27 18:10:46

我有两个数组mat1 &Mat2。我想让new_mat=[ma1,mat2];我已经写了一个有效的函数。我想知道是否有一个有效的函数对于非常大的矩阵或者我如何用数组来做。CopyTo方法。

public static double[,] Concatenate_matrix_byCol(double[,] Mat1, double[,] Mat2)
{
    int col1=Mat1.GetLength(1);
    int col2 = Mat2.GetLength(1);
    int row1=Mat1.GetLength(0);
    int row2 = Mat2.GetLength(0);
    int i, j,  y;
    double[,] newMat = new double[row1, col1 + col2];
    for (i = 0; i < row1; i++)
    {
        for (j = 0; j < col1; j++)
        {
            newMat[i, j] = Mat1[i, j];
        }
    }                
    for (i = 0; i < row1; i++)
    {
        for (y = 0; y < col2; y++)
        {
            newMat[i, y+col1] = Mat2[i, y];
        }
    }
    return newMat;
}

连接一个2D数组

你可以将你的循环组合成:

for (i = 0; i < row1; i++)
{
     for (j = 0; j < col1; j++)
         newMat[i, j] = Mat1[i, j];
     for (y = 0; y < col2; y++)
         newMat[i, y+col1] = Mat2[i, y];
}

也许可以使用指针代替(首先测试性能!),但是库将是最好的解决方案。这样你就不必自己做微优化了。

这个线程中提到了很多。net库:

根据你的性能要求,你也可以看看并行算法,你可能会受到http://innovatian.com/2010/03/parallel-matrix-multiplication-with-the-task-parallel-library-tpl/的启发。同样,一个构建良好的库可能已经有并行算法了。

移动Array时,应该查看Array。CopyTo而不是逐个移动单元格。

你也可以创建一个类来接受这两个矩阵,并提供一个抽象层次,使它们看起来像一个矩阵,但只是保持它们分开。

例如M1 = 20x 30M2 = 25 x 30,所以你有一个类M3看起来像M1 + M2,一个55 x 30的矩阵。

当有人请求M3[28, 23]时,该类将知道它应该重定向到M2[8, 23],因为M1只有20个位置宽(28-20=8)。这样你就不用复制内存了,那样很贵。弄清楚如何将请求重新路由到正确的矩阵要便宜得多。显然,这取决于之后对矩阵的访问。

编辑这就是我的意思:

class Program {
    static void Main(string[] args) {
        int[,] x = { { 1, 2, 3 }, { 4, 5, 6 } };
        int[,] y = { { 7, 8, 9 }, { 10, 11, 12 } };
        var xy = new StitchMatrix<int>(x, y);
        Console.WriteLine("0,0=" + xy[0, 0]); // 1
        Console.WriteLine("1,1=" + xy[1, 1]); // 5
        Console.WriteLine("1,2=" + xy[1, 2]); // 6
        Console.WriteLine("2,2=" + xy[2, 2]); // 9
        Console.WriteLine("3,2=" + xy[3, 2]); // 12
    }
}
class StitchMatrix<T> {
    private T[][,] _matrices;
    private int[] _lengths;
    public StitchMatrix(params T[][,] matrices) {
        // TODO: check they're all same size          
        _matrices = matrices;
        // call uperbound once for speed
        _lengths = _matrices.Select(m => m.GetUpperBound(0)).ToArray();
    }
    public T this[int x, int y] {
        get {
            // find the right matrix
            int iMatrix = 0;
            while (_lengths[iMatrix] < x) {
                x -= (_lengths[iMatrix] + 1);
                iMatrix++;
            }
            // return value at cell
            return _matrices[iMatrix][x, y];
        }
    }
}

问候Gert-Jan