C#で行列の乗算や合計などにXNAベクトルを宣言して使用しようとしています。
これらは画像処理に使用され、通常のSetPixelやGetPixelよりも高速になります。しかし、私は常に実用的な例を見つけることができず、オンラインで多くの例を試しましたが、何かが足りないようです。
ヘルプとサンプルコードはありますか?
ありがとう!
C#で行列の乗算や合計などにXNAベクトルを宣言して使用しようとしています。
これらは画像処理に使用され、通常のSetPixelやGetPixelよりも高速になります。しかし、私は常に実用的な例を見つけることができず、オンラインで多くの例を試しましたが、何かが足りないようです。
ヘルプとサンプルコードはありますか?
ありがとう!
パフォーマンスが心配な場合は、 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の質問も確認する必要があります
頂点は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);
}
}