MATLAB関数の機能を実装しようとしていますsparse
。
次のような特定のインデックスでスパース行列に値を挿入します。
同じインデックスの値がすでにマトリックスに存在する場合は、新しい値と古い値が追加されます。
それ以外の場合は、新しい値がマトリックスに追加されます。
機能addNode
は正常に動作しますが、問題は非常に遅いことです。この関数を約100000回ループで呼び出し、プログラムの実行に3分以上かかります。MATLABは、このタスクをほんの数秒で実行します。コードを最適化する方法や、自分の関数の代わりにstlアルゴリズムを使用して、目的を達成する方法はありますか?
コード:
struct SparseMatNode
{
int x;
int y;
float value;
};
std::vector<SparseMatNode> SparseMatrix;
void addNode(int x, int y, float val)
{
SparseMatNode n;
n.x = x;
n.y = y;
n.value = val;
bool alreadyPresent = false;
int i = 0;
for(i=0; i<SparseMatrix.size(); i++)
{
if((SparseMatrix[i].x == x) && (SparseMatrix[i].y == y))
{
alreadyPresent = true;
break;
}
}
if(alreadyPresent)
{
SparseMatrix[i].value += val;
if(SparseMatrix[i].value == 0.0f)
SparseMatrix.erase(SparseMatrix.begin + i);
}
else
SparseMatrix.push_back(n);
}