On Tuesday, September 15, 2015 at 11:02:26 PM UTC-4, Jack Poulson wrote:
>
> I believe that Tony is suggesting manually applying the sparse operator
> rather than explicitly constructing it and then applying it. This is a
> common (and significant) performance optimization when a sparse operator is
> only used once or twice, as the construction of the sparse matrix is often
> *more* expensive than applying it once.
>
> The answer to your question (since you are applying the sparse matrix from
> the right to a row vector) would be a loop of the form: forall nonzero
> triplets (i,j,value), y[j] += x[i] * value.
>
> On Tuesday, September 15, 2015 at 8:52:46 AM UTC-7, Frank Kampas wrote:
>>
>> Could you post a link to the part of the documentation that describes how
>> to do that?
>>
>> On Tuesday, September 15, 2015 at 3:53:11 AM UTC-4, Tony Kelman wrote:
>>>
>>> Instead of constructing a sparse matrix in the inner loop it would be
>>> more efficient to write an in place stencil kernel function to perform the
>>> equivalent operation.
>>
>>
This is what I'm doing now. It's a little faster.
for i = 1:n
for j = i:n
if i == j
lhs[rctr,i] = -2 * start[i]
lhs[rctr,n+i] = -2 * start[n+i]
lhs[rctr,2n+1] = -2 * (radii[i] - start[2n+1])
rhs[rctr] = -start[i]^2 - start[n+i]^2 + start[2n+1]^2-
radii[i]^2
else
lhs[rctr,i] = 2 * (start[i] - start[j])
lhs[rctr,j] = 2 * (start[j] - start[i])
lhs[rctr,n+i] = 2 * (start[n+i]-start[n+j])
lhs[rctr,n+j] = 2 *(start[n+j] - start[n+i])
rhs[rctr] = (start[i]-start[j])^2 +
(start[n+i]-start[n+j])^2 + (radii[i]+radii[j])^2
end
rctr += 1
end
end