2014-01-09 6 views
0

Мне нужно создать способ умножить заданную матрицу на ее транспонирование.Как умножить заданную матрицу на ее транспонирование?

enter image description here

Рассмотрим мою матрицу является 2D массиву double [][] matrix;

public double[][] MultiplyByTranspose(double[][] matrix) 
{ 
    return newMatrix; 
} 

Если вам нужен мой класс Matrix проверить его в answer of this question

+0

@Octoshape, что я могу попробовать, если я не знаю, как вращать матрицу! если вы не можете помочь, прекратите публикацию того же старого бесполезного комментария –

+2

извините меня за то, что вы пытаетесь приспособиться к правилам этого сайта, но вам не кажется, что вы что-то пробовали (отсюда, вероятно, нисходящее, что не мое путь). – Octoshape

+1

Вам не нужно полностью вращать матрицу, вращение - это просто инструмент для визуализации того, как выглядит транспонирование матрицы. Когда вы переносите матрицу, вы обрабатываете столбцы как строки, а строки как столбцы, то есть первая строка становится первым столбцом и так далее. – Dirk

ответ

1

Ну, самый простой способ, это просто реализовать Транспонирование и умножение.

Конечно, когда в сочетании, это можно было бы сделать более эффективным , но я думаю, что вам нужно транспонирование и умножение как отделенный рутина далее в коде (вы просили о матрице вращения)

public static Boolean IsRectangle(Double[][] value) { 
    if (Object.ReferenceEquals(null, value)) 
    return false; 
    else if (value.Length <= 0) 
    return false; 

    Double[] line = value[value.Length - 1]; 

    if (Object.ReferenceEquals(null, line)) 
    return false; 

    int size = line.Length; 

    for (int i = value.Length - 2; i >= 0; --i) 
    if (Object.ReferenceEquals(null, value[i])) 
     return false; 
    else if (value[i].Length != size) 
     return false; 

    return true; 
} 

public static Double[][] Transpose(Double[][] value) { 
    if (Object.ReferenceEquals(null, value)) 
    throw new ArgumentNullException("value"); 

    if (!IsRectangle(value)) 
    throw new ArgumentException("value should be a rectangular matrix.", "value"); 

    int colCount = value.Length; 
    int rowCount = value[value.Length - 1].Length; 

    Double[][] result = new Double[rowCount][]; 

    for (int i = rowCount - 1; i >= 0; --i) { 
    Double[] line = new Double[colCount]; 
    result[i] = line; 

    for (int j = colCount - 1; j >= 0; --j) 
     line[j] = value[j][i]; 
    } 

    return result; 
} 

// Simple quibic algorithm 
public static Double[][] Multiply(Double[][] left, Double[][] right) { 
    if (Object.ReferenceEquals(null, left)) 
    throw new ArgumentNullException("left"); 
    else if (Object.ReferenceEquals(null, right)) 
    throw new ArgumentNullException("right"); 

    if (!IsRectangle(left)) 
    throw new ArgumentException("left should be a rectangular matrix", "left"); 
    else if (!IsRectangle(right)) 
    throw new ArgumentException("right should be a rectangular matrix", "right"); 

    int leftRows = left.Length; 
    int leftCols = left[0].Length; 

    int rightRows = right.Length; 
    int rightCols = right[0].Length; 

    if (leftCols != rightRows) 
    throw new ArgumentOutOfRangeException("right"); 

    Double[][] result = new Double[leftRows][]; 

    for (int r = leftRows - 1; r >= 0; --r) { 
    Double[] leftLine = left[r]; 
    Double[] line = new Double[rightCols]; 
    result[r] = line; 

    for (int c = rightCols - 1; c >= 0; --c) { 
     Double s = 0.0; 

     for (int i = leftCols - 1; i >= 0; --i) 
     s += leftLine[i] * right[i][c]; 

     line[c] = s; 
    } 
    } 

    return result; 
} 

... 

public double[][] MultiplyByTranspose(double[][] matrix) { 
    //TODO: Check the order! Which matrix should be the first and which the second, 
    // In Linear Algebra A * B != B * A 
    return Multiply(matrix, Transpose(matrix)); 
    // Or 
    // return Multiply(Transpose(matrix), matrix); 
} 
+0

Почему он работает только на прямоугольных матрицах? может быть глупым вопросом, но просто интересно .. – Octoshape

+0

@Octoshape: Насколько я знаю, линейная алгебра (Transpose, Multiplication и т. д.) использует только прямоугольные матрицы, а не зубчатые. –

+0

@Octoshape Математически существуют только прямоугольные матрицы с квадратными матрицами как особый случай. Однако использование 'double [] []' для описания матрицы не гарантирует, что она прямоугольная. Для этого вам придется использовать 'double [,]'. – Dirk

Смежные вопросы