Boost logo

Ublas :

From: Nizar Khalifa Sallem (nksallem_at_[hidden])
Date: 2008-08-13 16:39:55


James Sutherland wrote:
>
> On Aug 13, 2008, at 12:40 PM, Nizar Khalifa Sallem wrote:
>
>> James Sutherland wrote:
>>>
>>> On Aug 13, 2008, at 11:26 AM, Nizar Khalifa Sallem wrote:
>>>>
>>>> Second, the easy dirty way is to do something like :
>>>> ublas::vector tmpRow = matrix_row<MatType> row( m, 1 );
>>>> matrix_row<MatType> row( m, 1 ) = matrix_row<MatType> row( m, 3 );
>>>> matrix_row<MatType> row( m, 3 ) = tmpRow;
>>>>
>>>> Finally, you may use iterators (you need to check for consistency):
>>>> ublas::compressed_matrix<double>::iterator1 srcRowIt, dstRowIt
>>>> ublas::compressed_matrix<double>::iterator2 src_ij, dst_ij, tmp_ij;
>>>> dstRowIt = srcRowIt = m.begin1();//iterator over row 0
>>>> ++srcRowIt;//here will iterate over row 1;
>>>> dstRowIt+=3;//iterate over row 3;
>>>> for (src_ij = srcRowIt.begin(), dst_ij = dstRowIt.begin();
>>>> src_ij != srcRowIt.end();
>>>> ++src_ij,++dst_ij) {
>>>> tmp_ij = src_ij;
>>>> src_ij = dst_ij;
>>>> dst_ij = tmp_ij;
>>>> // if you do something like src_ij = dst_ij; you will loose
>>>> your row 1 elements'
>>>> }
>>>>
>>>> I didn't check this code, if you want columns just invert iterator1
>>>> and iterator 2
>>>
>>> Thanks for the suggestions.
>>>
>>> It seems to me that the examples you provide copy column 3 to column
>>> 1. However, I want to *move* it. In other words, I want move
>>> coefficients within a given matrix_row from one column to another.
>>>
>>> I don't see how the examples you provide do this. Perhaps I am just
>>> confused???
>>>
>> in the first suggestion, I did copy content of row 3 into row 1
>> in the second one, I move the iterator location (memory address), I
>> guess you understand functioning of iterators, if not you can assume
>> iterators as augmented pointers.
>>
>
> I do understand pointers. I think that we have a miscommunication.
> Let me be more clear. Assume I have the following:
> [ 1 1 0 0 ]
> m = [ 0 2 2 0 ]
> [ 0 0 3 3 ]
> and I want to form
> [ 0 1 0 1 ]
> [ 0 2 2 0 ]
> [ 3 0 0 3 ]
> Furthermore, since this is stored in a compressed matrix, I do not
> store zeros. These matrices have two nonzero entries per row.
>
> Thus, if I create a matrix_row for the first row,
> matrix_row<MatType> row1 = matrix_row( m, 1 );
> matrix_row<MatType>::iterator icol = row1.begin();
> now "icol" iterates over the first two columns in this case.
> Furthermore, icol.index() returns the *column* index, since icol is a
> iterator over the columns. What I want to do is modify icol.index().
> I cannot obtain a pointer to the fourth column of the first row since
> it does not exist.
>
> How then can I move the first column of row 1 to the fourth column?
> As I said originally, I can use erase_entry(...) and
> insert_entry(...) but I am hoping to accomplish this using a
> matrix_row object, since that is much more convenient in my
> application (the matrix itself is not readily available).
>
> James
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/ublas
In deed I have misunderstood.
Exposed that way, I think that insert_element and erase_element are the
best solution since the elements you want to move could be zero ones.
That is said, you can modify iterators location, as I have mentioned but
not the same way, but this won't be optimal and worse it won't be secure.
Best regards and sorry for the misunderstanding.