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