C #: Объявление и использование векторов XNA для умножения матриц, et. аль - PullRequest
0 голосов
/ 05 июля 2011

Я пытаюсь объявить и использовать векторы XNA для умножения матриц, суммирования и т. Д. В C #.

Они будут использоваться для обработки изображений, чтобы сделать это быстрее, чем обычные SetPixel и GetPixel. Тем не менее, я всегда не могу найти работающий пример, и я пробовал много примеров в Интернете, но, похоже, я что-то упустил.

Любая помощь и пример кода?

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Если вас беспокоит производительность, вы можете вернуться к кодированию в контексте unsafe.

Помечая тип, элемент типа или блок оператора с помощью ключевого слова unsafe, вы можете использовать указательвводит и выполняет операции с указателями в стиле C ++ над памятью в этой области, чтобы иметь возможность делать это в среде управляемого выполнения.Небезопасный код может работать быстрее, чем соответствующая безопасная реализация.

Вот хороший, короткий пример из книги C # 4.0 в двух словах:

unsafe void BlueFilter (int[,] bitmap)
  {
    int length = bitmap.Length;
    fixed (int* b=bitmap)
    {
        int* p=b;
        for (int i=0, i<length; i++)
        *p++ &= 0xFF;
    }
   }

( Источник )

Кроме того, вам также следует взглянуть на этот вопрос SO

Почему умножение матриц в .NET так медленно?

0 голосов
/ 05 июля 2011

Векторами являются только 1 xn матриц.Создайте класс Matrix с методами суммирования и умножения.

public class Matrix
{
    private int[,] m_array;

    public Matrix(int m, int n)
    {
        m_array = new int[m, n];
    }

    public Matrix(int[,] other)
    {
        m_array = other;
    }

    public Matrix Mult(Matrix other)
    {
        if (this.m_array.GetLength(1) != other.m_array.GetLength(0))
            return null;

        int[,] res = new int[this.m_array.GetLength(0), other.m_array.GetLength(1)];

        for (int i = 0; i < this.m_array.GetLength(0); ++i)
            for (int j = 0; j < other.m_array.GetLength(1); ++j)
            {
                int s = 0;
                for (int k = 0; k < this.m_array.GetLength(1); ++k)
                    s += this.m_array[i, k] * other.m_array[k, j];
                res[i, j] = s;
            }

        return new Matrix(res);
    }
}
...