三次元の変換行列について質問です。

空間上のある3点について、座標変換前と変換後の座標が与えられているとします。
その座標を元に、行った変換の表す行列を知りたいと考えております。
ただし変換は並進と回転のみとし、剪断変形等は行わないという条件です。
(行列は同次変換の形などで得られれば良いです)

ただし、変換前と変換後では三点の相対的な位置関係は完璧には一致しておりません。
そのため得られた変換を元の3点に行った際に、変換後の3点の座標(既知)との
誤差を最小化したいという問題です。

変換が相似変換でなければ疑似逆行列により計算が可能と思いますが、
並進・回転のみなのでどうしようか聞きたいと思い質問をしました。

パラメータは「x, y, z 軸方向の並進移動量 + x, y, z 軸周りの回転量」の6つなので、
プログラムを組んで6パラメータを少しずつ変化させ、
誤差の二乗和が最小となる箇所を探すという方法は思いついております。
ですが、その他に行列計算により解析的に答えを得る方法はないでしょうか。

また、変換前後の3点を元に誤差を最小化する変換行列を得ることが可能であるなら、
座標の情報が3点でなくそれ以上の場合でも計算は可能でしょうか。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.2へのコメントについてです。



> 例えば評価を誤差の絶対値の和などにすれば解けるということはあるのでしょうか。

 三角関数が入っている以上、非線形性は取り除けません。それでも何か旨い手はないかと、かつていろいろ考えたこともありますけれども、結局は反復計算しかありませんでした。ならば、下手な工夫をやるよりも、品質の良い出発値を使って素直に反復する方が計算が速くできます。

 なおご質問は、元の点のそれぞれが、座標変換によってどの点に移ったのかが分かっている、という話ですから簡単な部類です。もし、移った先が一体どの点なのか、変換前後の点同士の対応は不明、ということだと、なかなか手のこんだことをやらねばなりません。
    • good
    • 0

ANo.2訂正。



> (たとえばy[1]-y[2])が変換で(z[1]-z[2]に)一致するように回転を決める。


(たとえばy[1]-y[2])が変換で(z[1]-z[2]に)平行になるように回転を決める。

に訂正です。
    • good
    • 0

 誤差の二乗和を評価に用いていますから、非線形最小二乗法の問題です。

これはご質問にある通り、繰り返し数値計算をやって最適解を探索するしか手がありません。パラメータ(6次元ベクトルxで表しましょう)で表される変換P(x)の推定値を、繰り返しのたびに少しずつ改良して行く訳です。(変換Pを指して推定「値」と呼ぶのは日本語としてちょっと変な感じがしますけれども、あらゆる変換がなす空間の中での1点がPだ、というキモチを表しています。)

 解析の対象になるのは、繰り返しごとに「変換の現在の推定値」P(x) から「変換の改良された推定値」P(x+Δx) をどうやって推定すると早く正しく収束するか、また簡単に計算できるか、ということだけです。
 どうやれば早く(少ない繰り返し回数で)正しく収束するか、ということについては、非線形最小二乗法の一般論として様々な工夫が開発されています。しかし、ご質問の状況では、問題の性質が素直であり、しかも計算量がごく小さいので、そんな工夫は必要ない。むしろ凝ったことをやって毎回の繰り返し計算が複雑になることの弊害の方が大きいでしょう。

 以下で提案する方法は「ガウス・ニュートン法」の一種で、概ね「繰り返しのたびにパラメータの有効数字の個数(つまり有効桁数)が一定量ずつ増える」という性質を持っています。実用上、せいぜい数回~十数回の繰り返しをすれば足りるでしょう。

[1]「変換の改良された推定値」P(x+Δx) の計算には、線形近似を使います。既に得られている「変換の現在の推定値」 P(x)に、さらに微小な変換ΔPを掛けることで「変換の改良された推定値」P(x+Δx)を得るものとします。
  P(x+Δx) = (ΔP) P(x)
そして、その微小な変換ΔPをパラメータの一次式で近似するのです。すなわちP(x+Δx)をΔxでテイラー展開したときの二次以上の項を全部無視することで、
  ΔP ≒ Σ((∂P/∂x[i])(x))Δx[i]  (Σはi=1~6の総和。xは「パラメータの現在の推定値」)
とやる。ご質問の場合ですと具体的には、「ひとつの軸について微小な角度Δθだけ回転する」という操作を
  sin(Δθ) ≒ Δθ
  cos(Δθ) ≒ 1
で近似してやれば良いだけです。3つの回転それぞれについてこの近似を行うと、微小な変換ΔPは回転角度(3つ)と並進(3つ)のパラメータの線形結合(一次式)で表されたことになります。
 この線形近似によって、ΔPの6つの(微小な)パラメータΔx[i](i=1~6)の最適値は線形最小二乗法を使ってイッパツで計算できる形になります。すなわち変換前の点をy[k]、変換後の点をz[k]、残差をε[k] (k = 1, 2,…, K)として
  minimize Σ(|ε[k]|^2) (Σは全ての点 k = 1, 2,…, Kについての総和)where,
  z[k] = (ΔP) (P(x) y[k]) + ε[k]
という線形最小二乗法の問題を解くだけです。こうしてΔxが得られるので、「パラメータの改良された推定値」(x+Δx)が決まり、これを使って「変換の改良された推定値」P(x+Δx)を算出します。

[2] 実用上の非常に大切なポイントは、パラメータと変換の最初の推定値(出発値)をどう決めるかです。正解に近いところから出発すると、少ない繰り返しで安定して答が出るからです。
 ご質問の状況ですと、たとえば「3点が張る平面の法線ベクトルが変換で一致し、かつ、あるひとつの点から別のひとつの点へのベクトル(たとえばy[1]-y[2])が変換で(z[1]-z[2]に)一致するように回転を決める。さらに、点群の重心が変換で一致するように並進を決める」という問題を解析的に解いて、答を出す。この計算によって、「ほとんど正しい」パラメータの推定値および変換の推定値が得られますから、これを出発値として使い、繰り返し計算で改良していく訳です。

[3] どこで繰り返しをやめるか、ということも考えておかなくちゃいけません。前の繰り返しに比べて残差二乗和の相対変化がうんと小さくなったら、とか、パラメータの変化がうんと小さくなったら、など、用途に応じて適切な打ち切り条件を決めておく必要があります。が、その判定のための計算があんまり複雑じゃ本末転倒。逆に、大雑把に「ナニハトモアレ10回繰り返す」と決めとく、なんてのも、実用上はアリです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

「誤差の二乗和を評価に用いていますから、非線形最小二乗法の問題です」
とのことですが、例えば評価を誤差の絶対値の和などにすれば解けるということはあるのでしょうか。

誤差の二乗和というのは「できるだけ両者を一致させる」という目的のための
指標の一つですので、問題が解けるのであれば他のものでも問題ありません。
もしご存知でしたら、お教えいただければと思います。

ただ、三次元の回転行列は例えば
・sin(Alpha)・cos(Beta)・cos(Gamma) + cos(Alpha)・sin(Gamma)
のような成分が入るので、どのみち無理なのかなと思いました。

数値計算に関してもお教えいただき、ありがとうございます。
6つもあるパラメータをどう変化させて探索するか、
全探索だと時間がかかるだろうかなどと考えていたので、
このあたりを教えていただき助かります。

ガウス・ニュートン法についても調べてみて、
まずはそれらしいプログラムを書いてみようと思います。

お礼日時:2014/09/10 21:54

(こちらを情報工学カテゴリーに書いたほうが実践的だったかもしれませんが、)



変換前の3点を△ABC とみなし、変換後の3点を△A'B'C' とみなして、

それぞれの三角形の法線ベクトルを求め、

2つの法線ベクトルの向きが平行になるように法線回りの回転(ひねり角度)と、法線を飛行機の機首のように持ち上げる回転とを行い、

その後は、法線ベクトルが同じ点に揃うように平行移動(並進)させる、

というだけで十分ではないでしょうか。

ポリゴン 法線ベクトル 外積 - Google 検索
http://www.google.co.jp/search?q=%E3%83%9D%E3%83 …

法線ベクトル 外積 座標変換 - Google 検索
http://www.google.co.jp/search?q=%E6%B3%95%E7%B7 …

並進分は単純な引き算ですので、法線ベクトル(外積)の向きを平行に合わせる(法線ベクトル2つの「内積」を0にする)ような「ひねり回転」と「仰角・俯角」の2パラメータだけが試行錯誤(最小二乗法)になるだけで済むのではないでしょうか。

そして、3角形→3角形に限らず、4角形以上のポリゴンでも、同じ長さ・角度を維持している3点を用いて、その三角形の並進・回転で、ポリゴン全体の並進・回転を成立させることも可能かと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

私も一番最初に、三角形の法線をそろえてから計算するというのを考えました。
ですが、回答中の「法線ベクトルが同じ点に揃うように平行移動(並進)させる」
というのがいまいち分かりませんでした。

三角形をABCとA'B'C'とした時、確かに三角形の法線を求め、
それを一致させる回転を求めることはできます。
しかし、法線ベクトルはあくまでABとACの外積として求めるものであり、
「ベクトルの始点をそろえる」ということに意味はないのではないでしょうか。

できるのは、例えば点Aと点A'を一致させるとか、
ABCとA'B'C'の重心をそろえることだけではないかと思います。

また2つの三角形の法線をそろえる(二つの三角を同一平面内におさめる)のが、
もっとも最適なそろえ方になるのか、という点に自信がありません。
もしかしたら、それが最適なのかもしれませんが...

お礼日時:2014/09/10 21:32

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q3次元での点群に対する最小二乗法での平面の算出について(点と平面の距離

3次元での点群に対する最小二乗法での平面の算出について(点と平面の距離。残差ではない。)

--

点と平面のZ軸方向の距離(残差)の二乗和を最小とする場合には、
平面をax+by+c=zとして、Σ(ax+by+c-z)^2をa,b,cのそれぞれで偏微分して
それを=0とした連立方程式を解くことで解を得ることが出来ました。
また、式の形も、ある点のxとyを平面の式へ代入した際の値と、点のz値の差分を見ており、
簡単に納得のできるものとなりました。

これに対して、点と平面の距離(空間的な最小距離)の二乗和を最小とする場合には、
どのような流れで計算すれば良いのでしょうか?
点と平面の距離は|Ax+By+Cz+D| (A,B,Cは単位ベクトル)として求まりますが、
これをどう使うのかが分かりません。
Σ(Ax+By+Cz+D)^2をA,B,C,Dのそれぞれで偏微分して=0としても、
定数項が無いため、連立方程式の解がすべてゼロとなってしまいます。
強引に、Σ(A'x+B'y+C'z+1)^2として変形させて解いてみましたが、
得られたA',B',C'からA,B,C,Dに戻すと、Dがきちんと出ませんでした。(他についても怪しい。)

こういった状況に迷い込んでしまい、どう考えるのが良いのか分からなくなってしまいました。
指南いただけませんでしょうか?

3次元での点群に対する最小二乗法での平面の算出について(点と平面の距離。残差ではない。)

--

点と平面のZ軸方向の距離(残差)の二乗和を最小とする場合には、
平面をax+by+c=zとして、Σ(ax+by+c-z)^2をa,b,cのそれぞれで偏微分して
それを=0とした連立方程式を解くことで解を得ることが出来ました。
また、式の形も、ある点のxとyを平面の式へ代入した際の値と、点のz値の差分を見ており、
簡単に納得のできるものとなりました。

これに対して、点と平面の距離(空間的な最小距離)の二乗和を最小とする場合に...続きを読む

Aベストアンサー

平面の式は、単に Ax+By+Cz+D=0 としたのでは、一意に決まりません。
同じ平面が、 2Ax+2By+2Cz+2D=0 とでも 3Ax+3By+3Cz+3D=0 とでも
書けるからです。
そのために、「(A,B,C) は単位ベクトル」としたのではありませんか?
だから、Σ(Ax+By+Cz+D)^2 を最小化するときに、単なる最小値でなく、
A^2+B^2+C^2=1 という制約下での最小値を探せばよいのです。
ラグランジュの未定乗数法が使えます。

あるいは、制約なしで、Σ(Ax+By+Cz+D)^2/√(A^2+B^2+C^2) を最小化
してもよいのだけれど。

Q3次元の近似直線

こんにちは。2次元で実験データなどの点列から近似直線を求めるのは、最小二乗法の基本問題ですが、3次元の点群から直線の方程式(x-x0)/a=(y-y0)/b=(z-z0)/cを求めるにはどんなアルゴリズムを使いますか?スマートな方法があれば教えていただけたら幸いです。よろしくお願いします。

Aベストアンサー

3次元空間の曲面ではなく、直線に乗ると仰るのだから、
(1) x, y, zのどれかを与えて、残りの2つを推定する問題。
(2) <x[i],y[i],z[i]>と直線との距離d[i]の二乗和が最小になる直線を求める問題。
と分類すべきでしょう。

(1)の場合は、たとえばzを与えてx,yを求めたいのであれば、
・zからxを求める問題。
・zからyを求める問題。
の二つを別々に解けばおしまいです。
それぞれの解は(x=Az+B, yは任意)という平面と、(y=Cz+D, xは任意)という平面を定めますから、この二つの平面の交線が、求める直線ということですね。

(2)の場合はやっかいです。
[1]ちょっと手抜きしながらも、まともにやってみましょう。
(i) 直線をどう表すか。
ご質問の式を見ると、この直線はx軸、y軸、z軸のどれとも平行でも垂直でもないことが仮定されています。
ですから、zをパラメータとして
x=az+c
y=bz+d
と書いても良いでしょう。a,b,c,dが決められれば良い訳です。
(ii) 点<p,q,r>と直線との最短距離を求める。
直線上の任意の点<az+c,bz+d, z>と点<p,q,r>の距離をdとすると
d^2 = (az+c-p)^2+(bz+d-q)^2+(z-r)^2
= (az)^2+2az(c-p)+(c-p)^2+(bz)^2+2bz(d-q)+(d-q)^2+z^2-2rz+r^2
です。これが最小になるzを求めると、
0=∂(d^2)/∂z = 2(az+c-p)a+2(bz+d-q)b+2(z-r)
ゆえに
z=(ap+bq+r-ac-bd)/(a^2+b^2+1)
であって、このときの最短距離h(p,q,r)は
h(p,q,r)^2 = (ap+bq+r-ac-bd)^2/(a^2+b^2+1)+2(ap+bq+r-ac-bd)(ac-ap+bd-bq-r)/(a^2+b^2+1)+(c-p)^2+(d-q)^2+r^2
わあ、とんでもないですね。
(iii) じゃあ、直線を求めるには?
S=Σ(h(x[i],y[i],z[i]))^2  (i=1,2,...,N)
を最小化するには
∂S/∂a = 0
∂S/∂b = 0
∂S/∂c = 0
∂S/∂d = 0
を解く必要があります。言い換えれば
∂(h(x[i],y[i],z[i]))/∂a
∂(h(x[i],y[i],z[i]))/∂b
∂(h(x[i],y[i],z[i]))/∂c
∂(h(x[i],y[i],z[i]))/∂d
を求めておいて
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂a)=0
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂b)=0
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂c)=0
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂d)=0
という連立方程式を解くことになります。
これがa,b,c,dについて非線形である(一次式でない)ことは言うまでもありません。一筋縄では行かず、反復計算で徐々に収束させていくしかありません。

[2]手抜き
もうすこし手抜きの方法を考えてみましょう。
この座標系を回転・平行移動した座標系をX-Y-Zとします。そして、求めたい直線がZ軸と一致するようにしたとします。回転と平行移動は行列を使って
X = R x + p
Y     y   q
Z     z   r
と表せます。Rは3×3の行列で Rの転置をR'とすると RR' = R' R = 単位行列
となる行列です。各点<x[i],y[i],z[i]>をこの変換で<X[i],Y[i],Z[i]>に写したとすると、
直線、すなわちZ軸との最短距離はX[i]^2 + Y[i]^2ですから、他のどんな回転・平行移動の仕方に比べても
U=Σ(X[i]^2 + Y[i]^2)  (i=1,2,....,N)
が最小になっている筈で、しかも
S=U
です。
 さて、UはZ[i]の値とは無関係ですからZ[i]を求める必要はない。さらに座標系をZ軸の周りで回転してもUは変化しません。従って、
X = R x + p
Y     y   q
      z
R =P(α)Q(β)
P(α)=cosα  0  -sinα
       0   1    0
Q(β)= 1  0     0
      0 cosβ -sinβ
      0 sinβ  cosβ
とすれば良いのです。展開すれば
X[i] = x[i]cosα-y[i]sinαsinβ-z[i]sinαcosβ+p
Y[i] = y[i]cosβ-z[i]sinβ+q
ですね。
ここでα、β、p、qを決めたい訳です。

 始めに(1)の問題を解けば、α、β、p、qの大体の値を求めることができます。これを使ってU(α,β,p,q)を計算します。
 それから、U(α,β,p,q)が小さくなるようにα、β、p、qをちょっとずつ改良して行けば良いでしょう。これには微小な角度Δα、Δβを使って、
P(Δα)=cosΔα  0  -sinΔα
        0    1    0
      sinΔα  0   cosΔα
Q(Δβ)= 1  0      0
       0 cosΔβ -sinΔβ
       0 sinΔβ  cosΔβ
を作り、P(α)、Q(α)にそれぞれ掛け算すれば良い。
P(α+Δα)=P(Δα)P(α)
Q(β+Δβ)=Q(Δβ)Q(β)
だからです。さらにここで、Δα、Δβは微小だから、
cosΔα≒1、cosΔβ≒1、sinΔα≒Δα、sinΔβ≒Δβ
(Δα)^2≒0、(Δβ)^2≒0、ΔαΔβ≒0
という近似をしても構わないでしょう。
この近似を利用すると計算は一層簡単になり、Uを最小にするようにΔα、Δβ、p、qを求める問題は線形最小二乗法(一次式の最小二乗法)になってしまい、簡単に解けます。
それを解いてから、真面目にP(α)、Q(α)を計算しなおし、また線形最小二乗法を解く。これを収束するまで繰り返せば良いのです。

なお、stomachmanは計算間違いの常習犯ですから、チェックは慎重に。

3次元空間の曲面ではなく、直線に乗ると仰るのだから、
(1) x, y, zのどれかを与えて、残りの2つを推定する問題。
(2) <x[i],y[i],z[i]>と直線との距離d[i]の二乗和が最小になる直線を求める問題。
と分類すべきでしょう。

(1)の場合は、たとえばzを与えてx,yを求めたいのであれば、
・zからxを求める問題。
・zからyを求める問題。
の二つを別々に解けばおしまいです。
それぞれの解は(x=Az+B, yは任意)という平面と、(y=Cz+D, xは任意)という平面を定めますから、この二つの平面の交線が、求め...続きを読む

Qエクセル STDEVとSTDEVPの違い

エクセルの統計関数で標準偏差を求める時、STDEVとSTDEVPがあります。両者の違いが良くわかりません。
宜しかったら、恐縮ですが、以下の具体例で、『噛み砕いて』教えて下さい。
(例)
セルA1~A13に1~13の数字を入力、平均値=7、STDEVでは3.89444、STDEVPでは3.741657となります。
また、平均値7と各数字の差を取り、それを2乗し、総和を取る(182)、これをデータの個数13で割る(14)、この平方根を取ると3.741657となります。
では、STDEVとSTDEVPの違いは何なのでしょうか?統計のことは疎く、お手数ですが、サルにもわかるようご教授頂きたく、お願い致します。

Aベストアンサー

データが母集団そのものからとったか、標本データかで違います。また母集団そのものだったとしても(例えばクラス全員というような)、その背景にさらならる母集団(例えば学年全体)を想定して比較するような時もありますので、その場合は標本となります。
で標本データの時はSTDEVを使って、母集団の時はSTDEVPをつかうことになります。
公式の違いは分母がn-1(STDEV)かn(STDEVP)かの違いしかありません。まぁ感覚的に理解するなら、分母がn-1になるということはそれだけ結果が大きくなるわけで、つまりそれだけのりしろを多くもって推測に当たるというようなことになります。
AとBの違いがあるかないかという推測をする時、通常は標本同士の検証になるわけですので、偏差を余裕をもってわざとちょっと大きめに見るということで、それだけ確証の度合いを上げるというわけです。

QSE(3)とは?

SE(3)とは何でしょうか?
幾何学か代数学の一分野らしいのですが、
よく分かりません。
工学の学士が分かる範囲でよろしくお願いします。

Aベストアンサー

3次元ユークリッド空間の運動群じゃないの?
回転と平行移動の組み合わせ。
制御なんかに使うんじゃないかと思うけど。

Q例 の省略 ex と e.g.

これまで、「例」の省略として、e.g.(exempli gratia,for example)を使ってきたのですが、Ex.もよく見かけます(主に日本語の文中で)。
私の読む英文は学術系に偏っているので、e.g.しか使われないのかもしれないと思いました。普通の英文でもexは、使われることが多いのでしょうか。
goo辞書、アルク英辞郎、Yahoo辞書では、EXが、exampleの略とは出ていなかったので質問させていただきました。

Aベストアンサー

e.g.は文中の括弧内で例を列記するときに使いますよね(e.g. こ、ん、な、ふ、う、に)。

一方Ex.は、例文とかの文頭に使うのがほとんどじゃないでしょうか。Ex. こんなふうに。

Ex.は単にExampleの略、e.g.はfor exampleの略といった感じでしょうか。

参考URL:http://philosophy.byu.edu/classes/dj/phil200hwin05/Basic%20Grammar%20Packet%2010jan05.pdf

QSTLで、vectorのファイルへの書き出し、読み込み。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(std::vector<int, std::allocator<int> >, long unsigned int)’
/usr/include/c++/4.2.1/bits/ostream.tcc:173: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::write(const _CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]

とのことです orz. どのようにすれば vector を書き出し、そして読み込むことができるのでしょうか。情報がありましたら是非お寄せください。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream...続きを読む

Aベストアンサー

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();

testvector.clear();
count = 0;

ifstream in("test.dat", ios::in | ios::binary);
if ( !in ) return 1;
in.read(reinterpret_cast<char*>(&count), sizeof(count));
testvector.assign(count, 0);
in.read(reinterpret_cast<char*>(&testvector[0]), testvector.size() * sizeof(int));
in.close();

for ( int i = 0; i < testvector.size(); ++i )
cout << testvector[i] << endl;
}

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();...続きを読む

QMPL2.0ライセンスのライブラリを使った開発

MPL2.0ライセンスをうたったライブラリを使って開発し、製品として出荷したい考えています。

http://www.mozilla.org/MPL/2.0/FAQ.html
のQ11をみると、
MPL2.0ライセンスをうたっている該当のライブラリを変更せずに使うのであれば
製品のソースコードは開示しなくてもよいと読み取れるのですが
この解釈で正しいのでしょうか。

教えて頂けると大変助かります。

Aベストアンサー

いえーすざっつらいと。

MPL2.0のライセンスで公開されているライブラリ(より正確に言えばMPL2.0のライセンスで公開されているのはライブラリではなくてソースコード)をリンクして実行するプログラムにはソースコード公開義務はない。
それはQ12にまとめられている
MPL: The copyleft applies to any files containing MPLed code.
LGPL: The copyleft applies to any library based on LGPLed code.
GPL: The copyleft applies to all software based on GPLed code.
の方が理解しやすいかも知れない。

つまり、MPLなライブラリを使用して開発するにあたり、そのライブラリの一部を改変して再コンパイルした場合はその修正されたソースコードファイルについてはソースコードを公開し、かつそのソースコードはMPLでライセンスされる必要があるが、それの中に書かれてあるルーチンを呼び出すプログラムが書かれたファイルは何もしなくてOKだ。
・library.c ←MPL2.0
・mysource.c ←あなたが作った
の2ファイルを1つのEXEにして配布する場合でもmysource.cは公開義務はない。library.cを改変したとしても、公開義務があるのは改変されたlibrary.cのみであり、mysource.cには影響しない。

いえーすざっつらいと。

MPL2.0のライセンスで公開されているライブラリ(より正確に言えばMPL2.0のライセンスで公開されているのはライブラリではなくてソースコード)をリンクして実行するプログラムにはソースコード公開義務はない。
それはQ12にまとめられている
MPL: The copyleft applies to any files containing MPLed code.
LGPL: The copyleft applies to any library based on LGPLed code.
GPL: The copyleft applies to all software based on GPLed code.
の方が理解しやすいかも知れない。

つま...続きを読む

Qジョルダン標準形への変換行列の求め方について

この画像の問題の(2)のジョルダン標準形への変換行列Tの求め方なのですが、
定石どおりにλ=1-αが重根のため[A-(1-α)E]t=aとなる列ベクトルtを求めようとしましたが
t=c1[1 0 0]+c2[0 1 0]となってしまい求めることができませんでした。
次にジョルダン標準形Jは決定するためこれからTJ=ATより求めようとしたところ
これでも第1行目が決定せず求めることができませんでした。

回答を見ましたところTJ=JTよりTを決定していました。
回答は少し見にくいですがT=[a;(-3/4) (1) (0);b]となっておりました。

この求め方の意味がわからないのでどなたか教えていただけないでしょうか…
また私がやった定石どおりの方法でこの問題は解くことはできませんか?

どなたかよろしくお願いいたします。

Aベストアンサー

とりあえず問題の T は忘れてふつうに
J = P^(-1)AP
の P を求めようとするなら, あなたのやった通りでできますよ.

まず 1-α に対する固有ベクトル [1, 0, 0] と -2 に対する固有ベクトル (略) はあってる. んで 1-α に対して一般化固有ベクトルがもう 1本あって, それは
[A-(1-α)E] x = [1, 0, 0]
の解として
x = [c, 1, 0]
が出てくる. これで合計 3本の (一般化) 固有ベクトルが得られたので, これをふつうに並べれば P になる.

と, #3 に書いてある.

QC言語での引数の省略方法

お世話になります。
C言語での関数の引数の省略方法についてお聞きしたいです。
たとえば、CalA(x,y,z)という関数があるとします。
このzの部分を使用しないときは省略という風にしたいのです。
CalA("あ","い","う");
CalA("あ","い");
↑このようにどちらにも対応したい。

VBではそのようにできたと思うのですが、Cでは可能なやり方があるのでしょうか?
よろしくお願いします。

Aベストアンサー

#1です

> char型の場合は
> void CalA(int x,int y,char *z='')

それでOKです。

ただ、#4の方のおっしゃるように、コンパイルエラーが出ないため、設計がかなりしっかりしていないと危険ではあります。
危険ですが、実際にシステム開発のときに用いられる手法ですので、問題はないと思います。
ただ、ここでの不具合が報告されないため、実装後、該当関数関連の試験は重点的に行ったほうがよいですね。

Q絶対値の最大を探す

ある範囲の絶対値の最大値
を検索したいのですがどうすればいいでしょうか?

Aベストアンサー

こんにちは。KenKen_SP です。

=MAX(ABS(A1:C20))

と計算式を入力したら[Ctrl]+[Shift]+[Enter] で確定します。
配列数式。


人気Q&Aランキング

おすすめ情報