MS-Excel (v2007 と v2003 の両方) で対称行列を扱うことがあります。
下の三角形から上の三角形に式をコピーするのに役立つオプションはありますか?
コピーと貼り付け/トランスポンスのようなものである必要がありますが、これらの機能は通常、長方形の領域でのみ機能します。
追加された図では、行列の上三角形の対称値をリンクすることによって複製する必要がある式の例を見ることができます。
MS-Excel (v2007 と v2003 の両方) で対称行列を扱うことがあります。
下の三角形から上の三角形に式をコピーするのに役立つオプションはありますか?
コピーと貼り付け/トランスポンスのようなものである必要がありますが、これらの機能は通常、長方形の領域でのみ機能します。
追加された図では、行列の上三角形の対称値をリンクすることによって複製する必要がある式の例を見ることができます。
上記の回答の 1 つが示すように、これは Excel の数式を使用して行うことができます。しかし、これは非常に面倒な手順だと思います。特にこれが定期的に行う必要がある場合。その場合、VBA を使用すると時間を大幅に節約できます。
次のコードは、正方形の選択で機能し、事前に入力されているのがマトリックスの下部または上部であるかどうかに関係なく、マトリックスの残りの部分を塗りつぶします。
Option Explicit
Sub FillSymetricMatrix()
Dim i As Integer, j As Integer
Dim SelRng As Range
Dim FillArea As String
Dim FRow As Integer
Dim FCol As Integer
Set SelRng = Selection
FRow = SelRng.Rows(1).Row
FCol = SelRng.Columns(1).Column
'Returns information about which area to fill
If ActiveSheet.Cells(FRow + SelRng.Rows.Count - 1, FCol).Value <> vbNullString Then 'Lower filled
If ActiveSheet.Cells(FRow, FCol + SelRng.Columns.Count - 1).Value = vbNullString Then 'Upper empty
FillArea = "Upper"
Else
FillArea = "Error"
End If
Else
If ActiveSheet.Cells(FRow, FCol + SelRng.Columns.Count - 1).Value <> vbNullString Then 'Upper filled
FillArea = "Lower"
Else
FillArea = "Error"
End If
End If
'Determines if the selection is square
If SelRng.Rows.Count <> SelRng.Columns.Count Then FillArea = "Error"
'Fills empty area of the square (symetric) matrix
Select Case FillArea
Case Is = "Upper"
For i = 0 To SelRng.Rows.Count - 1 Step 1
For j = 0 To SelRng.Columns.Count - 1 Step 1
If i <= j Then ActiveSheet.Cells(i + FRow, j + FCol).Value = ActiveSheet.Cells(j + FRow, i + FCol).Value
Next j
Next i
Case Is = "Lower"
For i = 0 To SelRng.Rows.Count - 1 Step 1
For j = 0 To SelRng.Columns.Count - 1 Step 1
If i <= j Then ActiveSheet.Cells(j + FRow, i + FCol).Value = ActiveSheet.Cells(i + FRow, j + FCol).Value
Next j
Next i
Case Else
MsgBox "The procedure cannot be performed on the current selection!"
End Select
End Sub
X(j,k)
必要なのは、正方行列の「対角」値を返す関数だと思います。X(k,j)
これを試して:
Function DIAGONAL(Arg As Range, Reference As Range) As Variant
Dim MyRow As Long, MyCol As Long
If Reference.Rows.Count <> Reference.Columns.Count Then
DIAGONAL = CVErr(xlErrRef)
Else
MyRow = Arg.Row - Reference.Row + 1
MyCol = Arg.Column - Reference.Column + 1
If MyRow < 1 Or MyCol < 1 Or MyRow > Reference.Rows.Count Or MyCol > Reference.Columns.Count Then
DIAGONAL = CVErr(xlErrNA)
Else
DIAGONAL = Reference(MyCol, MyRow)
End If
End If
End Function
この関数を VBA に入力すると、正方行列の内部または外部で使用できます...引数 (パラメーター: Arg) が行列 (パラメーター: 参照) 内にあることを確認する必要があります。 #N/A エラー。または、行列が正方でない場合、#REF エラーが発生します。
したがって、あなたの例では、B4: に入り、=10-DIAGONAL(B4,$B$2:$K$11)
これを下の三角形全体にコピーします。
完全な行列を転置することもできます...スクリーンショットで、セル B13 に移動し、=DIAGONAL(B2,$B$2:$K$11)
下と右に 9x を入力してコピーします
ボタンなし、Sub を明示的に開始する必要なし ... 任意のサイズの nxn 行列、文字列と数値の処理 ...
VBAでの例です。空のテーブルとボタンから始めます。
次に、ボタンでコードを実行します。
Option Explicit
Private Sub symmButton_Click()
MakeSymmetric Range("B2")
End Sub
Public Sub MakeSymmetric(ByRef r As Range)
Dim M As Long
M = CountCols(r)
Dim vals() As Variant
vals = r.Resize(M, M).Value2
Dim i As Long, j As Long
For i = 2 To M
For j = 1 To i - 1
vals(i, j) = vals(j, i)
Next j
Next i
r.Resize(M, M).Value2 = vals
End Sub
Public Function CountCols(ByRef r As Range) As Long
If IsEmpty(r) Then
CountCols = 0
ElseIf IsEmpty(r.Offset(0, 1)) Then
CountCols = 1
Else
CountCols = r.Worksheet.Range(r, r.End(xlToRight)).Columns.Count
End If
End Function
そして最後に結果を観察します
ショーンのソリューションと同様に、数式も使用します。転置された値を取得するには、次の式を使用します。
=INDEX($B$2:$G$7,COLUMN()-COLUMN($B$2)+1,ROW()-ROW($B$2)+1)
より複雑な操作 (例: ) を実行する場合は、名前付き範囲を使用することをお勧めします。名前マネージャーなどで=10-[transposedValue]
新しい名前を挿入します。TransposedValue
セル リンクの代わりに、上記の式を指定します。これで、マトリックスに次の式を文字通り書くことができます。
=10-TransposedValue
私はこの方法を持っています。あなたが言ったように、コピーペーストの転置は長方形の範囲で機能します。そして、あなたの問題は、三角形の範囲があることです。
あなたはこれを気に入るはずです....
1)。上三角行列を含む正方形の範囲を選択し、コピーします。
2)。空の場所でセルを選択し、次の 2 つの手順を実行します。
そして、対称行列を取得しました:-)
アニル。