Mercurial > octave-nkf
comparison liboctave/Sparse.cc @ 5760:8d7162924bd3
[project @ 2006-04-14 04:01:37 by jwe]
author | jwe |
---|---|
date | Fri, 14 Apr 2006 04:01:40 +0000 |
parents | c7d5a534afa5 |
children | 7ba9ad1fec11 |
comparison
equal
deleted
inserted
replaced
5759:ce79d238f142 | 5760:8d7162924bd3 |
---|---|
2490 { | 2490 { |
2491 if (jji < m && jj == j) | 2491 if (jji < m && jj == j) |
2492 { | 2492 { |
2493 octave_idx_type iii = 0; | 2493 octave_idx_type iii = 0; |
2494 octave_idx_type ii = idx_i.elem (iii); | 2494 octave_idx_type ii = idx_i.elem (iii); |
2495 for (octave_idx_type i = 0; i < new_nr; i++) | 2495 octave_idx_type ppp = 0; |
2496 octave_idx_type ppi = lhs.cidx(j+1) - | |
2497 lhs.cidx(j); | |
2498 octave_idx_type pp = (ppp < ppi ? | |
2499 lhs.ridx(lhs.cidx(j)+ppp) : | |
2500 new_nr); | |
2501 while (ppp < ppi || iii < n) | |
2496 { | 2502 { |
2497 OCTAVE_QUIT; | 2503 if (iii < n && ii <= pp) |
2498 | |
2499 if (iii < n && ii == i) | |
2500 { | 2504 { |
2501 if (scalar != RT ()) | 2505 if (scalar != RT ()) |
2502 { | 2506 { |
2503 stmp.data(kk) = scalar; | 2507 stmp.data(kk) = scalar; |
2504 stmp.ridx(kk++) = i; | 2508 stmp.ridx(kk++) = ii; |
2505 } | 2509 } |
2510 if (ii == pp) | |
2511 pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr); | |
2506 if (++iii < n) | 2512 if (++iii < n) |
2507 ii = idx_i.elem(iii); | 2513 ii = idx_i.elem(iii); |
2508 } | 2514 } |
2509 else if (j < lhs.cols()) | 2515 else |
2510 { | 2516 { |
2511 for (octave_idx_type k = lhs.cidx(j); | 2517 stmp.data(kk) = |
2512 k < lhs.cidx(j+1); k++) | 2518 lhs.data(lhs.cidx(j)+ppp); |
2513 { | 2519 stmp.ridx(kk++) = pp; |
2514 if (lhs.ridx(k) == i) | 2520 pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr); |
2515 { | |
2516 stmp.data(kk) = lhs.data(k); | |
2517 stmp.ridx(kk++) = i; | |
2518 } | |
2519 if (lhs.ridx(k) >= i) | |
2520 break; | |
2521 } | |
2522 } | 2521 } |
2523 } | 2522 } |
2524 if (++jji < m) | 2523 if (++jji < m) |
2525 jj = idx_j.elem(jji); | 2524 jj = idx_j.elem(jji); |
2526 } | 2525 } |
2628 } | 2627 } |
2629 else | 2628 else |
2630 for (octave_idx_type i = 0; i < m; i++) | 2629 for (octave_idx_type i = 0; i < m; i++) |
2631 rhs_idx_j[i] = i; | 2630 rhs_idx_j[i] = i; |
2632 | 2631 |
2633 // Count the number of non-zero terms | 2632 // Maximum number of non-zero elements |
2634 octave_idx_type new_nzmx = lhs.nnz (); | 2633 octave_idx_type new_nzmx = lhs.nnz() + rhs.nnz(); |
2635 for (octave_idx_type j = 0; j < m; j++) | |
2636 { | |
2637 octave_idx_type jj = idx_j.elem (j); | |
2638 for (octave_idx_type i = 0; i < n; i++) | |
2639 { | |
2640 OCTAVE_QUIT; | |
2641 | |
2642 if (jj < lhs_nc) | |
2643 { | |
2644 octave_idx_type ii = idx_i.elem (i); | |
2645 | |
2646 if (ii < lhs_nr) | |
2647 { | |
2648 for (octave_idx_type k = lhs.cidx(jj); | |
2649 k < lhs.cidx(jj+1); k++) | |
2650 { | |
2651 if (lhs.ridx(k) == ii) | |
2652 new_nzmx--; | |
2653 if (lhs.ridx(k) >= ii) | |
2654 break; | |
2655 } | |
2656 } | |
2657 } | |
2658 | |
2659 if (rhs.elem(rhs_idx_i[i],rhs_idx_j[j]) != RT ()) | |
2660 new_nzmx++; | |
2661 } | |
2662 } | |
2663 | 2634 |
2664 Sparse<LT> stmp (new_nr, new_nc, new_nzmx); | 2635 Sparse<LT> stmp (new_nr, new_nc, new_nzmx); |
2665 | 2636 |
2666 octave_idx_type jji = 0; | 2637 octave_idx_type jji = 0; |
2667 octave_idx_type jj = idx_j.elem (jji); | 2638 octave_idx_type jj = idx_j.elem (jji); |
2671 { | 2642 { |
2672 if (jji < m && jj == j) | 2643 if (jji < m && jj == j) |
2673 { | 2644 { |
2674 octave_idx_type iii = 0; | 2645 octave_idx_type iii = 0; |
2675 octave_idx_type ii = idx_i.elem (iii); | 2646 octave_idx_type ii = idx_i.elem (iii); |
2676 for (octave_idx_type i = 0; i < new_nr; i++) | 2647 octave_idx_type ppp = 0; |
2648 octave_idx_type ppi = lhs.cidx(j+1) - | |
2649 lhs.cidx(j); | |
2650 octave_idx_type pp = (ppp < ppi ? | |
2651 lhs.ridx(lhs.cidx(j)+ppp) : | |
2652 new_nr); | |
2653 while (ppp < ppi || iii < n) | |
2677 { | 2654 { |
2678 OCTAVE_QUIT; | 2655 if (iii < n && ii <= pp) |
2679 | |
2680 if (iii < n && ii == i) | |
2681 { | 2656 { |
2682 RT rtmp = rhs.elem (rhs_idx_i[iii], | 2657 RT rtmp = rhs.elem (rhs_idx_i[iii], |
2683 rhs_idx_j[jji]); | 2658 rhs_idx_j[jji]); |
2684 if (rtmp != RT ()) | 2659 if (rtmp != RT ()) |
2685 { | 2660 { |
2686 stmp.data(kk) = rtmp; | 2661 stmp.data(kk) = rtmp; |
2687 stmp.ridx(kk++) = i; | 2662 stmp.ridx(kk++) = ii; |
2688 } | 2663 } |
2664 if (ii == pp) | |
2665 pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr); | |
2689 if (++iii < n) | 2666 if (++iii < n) |
2690 ii = idx_i.elem(iii); | 2667 ii = idx_i.elem(iii); |
2691 } | 2668 } |
2692 else if (j < lhs.cols()) | 2669 else |
2693 { | 2670 { |
2694 for (octave_idx_type k = lhs.cidx(j); | 2671 stmp.data(kk) = |
2695 k < lhs.cidx(j+1); k++) | 2672 lhs.data(lhs.cidx(j)+ppp); |
2696 { | 2673 stmp.ridx(kk++) = pp; |
2697 if (lhs.ridx(k) == i) | 2674 pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr); |
2698 { | |
2699 stmp.data(kk) = lhs.data(k); | |
2700 stmp.ridx(kk++) = i; | |
2701 } | |
2702 if (lhs.ridx(k) >= i) | |
2703 break; | |
2704 } | |
2705 } | 2675 } |
2706 } | 2676 } |
2707 if (++jji < m) | 2677 if (++jji < m) |
2708 jj = idx_j.elem(jji); | 2678 jj = idx_j.elem(jji); |
2709 } | 2679 } |
2717 } | 2687 } |
2718 } | 2688 } |
2719 stmp.cidx(j+1) = kk; | 2689 stmp.cidx(j+1) = kk; |
2720 } | 2690 } |
2721 | 2691 |
2692 stmp.maybe_compress(); | |
2722 lhs = stmp; | 2693 lhs = stmp; |
2723 } | 2694 } |
2724 } | 2695 } |
2725 else if (n == 0 && m == 0) | 2696 else if (n == 0 && m == 0) |
2726 { | 2697 { |
2786 (*current_liboctave_warning_handler) | 2757 (*current_liboctave_warning_handler) |
2787 ("A(I) = X: X does not have same shape as I"); | 2758 ("A(I) = X: X does not have same shape as I"); |
2788 } | 2759 } |
2789 } | 2760 } |
2790 | 2761 |
2791 if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs)) | 2762 if (! assign1 (lhs, rhs)) |
2792 retval = 0; | 2763 retval = 0; |
2793 } | 2764 } |
2794 } | 2765 } |
2795 // idx_vector::freeze() printed an error message for us. | 2766 // idx_vector::freeze() printed an error message for us. |
2796 } | 2767 } |
2800 | 2771 |
2801 if (idx_i) | 2772 if (idx_i) |
2802 { | 2773 { |
2803 if (rhs_nr == 0 && rhs_nc == 0) | 2774 if (rhs_nr == 0 && rhs_nc == 0) |
2804 lhs.maybe_delete_elements (idx_i); | 2775 lhs.maybe_delete_elements (idx_i); |
2805 else if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs)) | 2776 else if (! assign1 (lhs, rhs)) |
2806 retval = 0; | 2777 retval = 0; |
2807 } | 2778 } |
2808 // idx_vector::freeze() printed an error message for us. | 2779 // idx_vector::freeze() printed an error message for us. |
2809 } | 2780 } |
2810 else if (lhs_nc == 1) | 2781 else if (lhs_nc == 1) |
2813 | 2784 |
2814 if (idx_i) | 2785 if (idx_i) |
2815 { | 2786 { |
2816 if (rhs_nr == 0 && rhs_nc == 0) | 2787 if (rhs_nr == 0 && rhs_nc == 0) |
2817 lhs.maybe_delete_elements (idx_i); | 2788 lhs.maybe_delete_elements (idx_i); |
2818 else if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs)) | 2789 else if (! assign1 (lhs, rhs)) |
2819 retval = 0; | 2790 retval = 0; |
2820 } | 2791 } |
2821 // idx_vector::freeze() printed an error message for us. | 2792 // idx_vector::freeze() printed an error message for us. |
2822 } | 2793 } |
2823 else | 2794 else |